文章收藏-FAQ 位置:电脑学习网

有关 C++ 语言中的 bit 操作

1)  函数实现交换两个int型变量的值,要求不定义任何中间变量。

C / C++ 版:

void Swap(int *a, int *b)
{
   *a^=*b;
   *b^=*a;
   *a^=*b;
}

C++ 版:

void Swap(int &a, int &b)
{
   a^=b;
   b^=a;
   a^=b;
}

分析一下:

(a ^ b = s)       (b ^ s = a)
0 ^ 1 = 1        1 ^ 1 = 0
1 ^ 0 = 1        0 ^ 1 = 1
1 ^ 1 = 0        1 ^ 0 = 1
0 ^ 0 = 0        0 ^ 0 = 0

归结一下:
1. 两个数相异或,相同的位清0,不同的位置1。 (所以才有了 XOR eax, eax ;eax清零)

2. s = (a ^ b); (b ^ s) == a ? Yes. 异或加密解密的基础.

   获得后缀0bit的个数。(从低位开始的连续的0bit,间接地求最低位的1bit的位置)
int ntz(unsigned x){ // Number of trailing zeros.
  int n;
  if (x == 0) return(32);
  n = 1;
  if ((x & 0x0000FFFF) == 0) {n = n +16; x = x 〉〉16;}
  if ((x & 0x000000FF) == 0) {n = n + 8; x = x 〉〉 8;}
  if ((x & 0x0000000F) == 0) {n = n + 4; x = x 〉〉 4;}
  if ((x & 0x00000003) == 0) {n = n + 2; x = x 〉〉 2;}
  return n - (x & 1);
}

3) 除了最低位的bit1,其余位全清0. 〈Hacker’s Delight〉一书。
   n = n & (-n)〈 - - - - 〉 n = n & (~n + 1)

分析一下:
    假设n(2) = X…X10…0。其中每个X代表bit值并不都是相同,0的个数≥0,ˉX表示该位取反。
    X & ˉX = 0, 1 & 0 = 0
    则~n(2) = ˉX…ˉX01…1。
    ~n + 1 = ˉX…ˉX10…0。
     n & (~n + 1) = 0…010…0

4) 清最低位的bit1,其他不变。
   n = n & (n – 1);
   则 n – 1 = X…X01…1
   n & (n - 1) = X…X00…0

5) 获得bit1的个数。(统计)

   我们常用的方法:

int Get1BitCount(unsigned int x)
{
   int n = 0;
   while (x 〉 0) {
    if (x & 0x1) n++;
    x 〉〉= 1;
}
return n;
}

另一种更好的办法:

int Get1BitCount(unsigned int x)
{
    int  n = 0;
    while (x 〉 0) {
      n++;
      x = x & (x - 1);
     }
     return n;
}

6) 求unsigned int型数一共有多少bit?(网上看到有人问)

 int  nCount = Get1BitCount((unsigned int)~0);

 求别的数据类型的位数,要重载Get1BitCount(或者直接用temlate来实现)。

 不过觉得像上面这样求法,太浪费了,不是吗?

 int GetTotalBit(void)
{
    unsigned int x = ~0;
    int  n = 0;
    while (x 〉 0) {
      n += 8;
      x 〉〉= 8;
     }
     return n;
}

7)清除低位到高位的n个bit1。

    while (--n 〉 0) {  x = x & (x - 1);}

     [文章来源:“十万个为什么”电脑学习网]
     [网络地址:http://why100000.com]
     [版权声明:除本站部分特别声明禁止转载的专稿外,其他的文章可以自由转载,但请务必注明出处和原始作者。本站文章版权归文章原作者所有。如果本站转载的文章有版权问题请联系本站,我们会尽快予以更正。]
 

【字体:[大] [中] [小] 【加入收藏】 【发表评论】 【关闭本窗口】

Copyright © “十万个为什么”电脑学习网 2000-2007 陕ICP备06007929号
站务联系:MSN & Email:zhangking2008@gmail.com  QQ:9365822