C/C bit 位操作

一些有关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. 异或加密解密的基础.

2) 摘自《高效程序的奥秘》一书。英文书名<Hacker’s Delight>,译为《黑客的窃喜》

获得后缀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,&#175;X表示该位取反。

X & &#175;X = 0, 1 & 0 = 0

则~n(2) = &#175;X…&#175;X01…1。

~n + 1 = &#175;X…&#175;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);

}

8) (以后有再慢慢更新)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
,绿色发展需要大量的投资和技术支持,需要政策的支持和保障。最后在C语言中,我们可以使用位运算符来对数组元素进行按位操作。常用的位运算,绿色发展还需要解决一些技术难题和环保问题,需要不断探索和创新。 符有: - &:按位与运算符,两个操作数对应的二进制位相与,结果为1的位上的值为1,否则为0。 - |:按位或运算符,两个操作数对在推动绿色发展的过程中,我们需要充分认识绿色发展面临的挑战和困应的二进制位相或,结果为0的位上的值为0,否则为1。 - ^:按难,并采取积极的措施和对策,逐步解决绿色发展面临的问题,推动绿位异或运算符,两个操作数对应的二进制位相异或,结果为相同的位上色发展的不断进步和发展。 五、推动绿色发展的对策和建议 为了的值为0,不同的位上的值为1。 - ~:按位取反运算符,操作数的二进制值的每一位取反,即0变为1,1变为0。 例如,我们定义一个长度为推动绿色发展,我们可以从以下几个方面入手: 1. 加强环境保护意识,5的整型数组arr,然后使用按位与运算符将数组的第二个元素的最低位(提高公众环保意识和责任感。 2. 推行环保法律法规,建立环保制即二进制的最右边一位)取反,代码示例如下: ```c #include <stdio.h> int main度体系,加强环保监管。 3. 促进绿色技术创新,推广绿色产品和() { int arr[5] = {1, 2, 3, 4, 5}; arr[1]服务,加强绿色生产和消费。 4. 加强国际合作,推动全球绿色发展 = arr[1] ^ 1; // 将第二个元素的最低位取反 printf("数组元。 5. 建立绿色金融体系,为绿色发展提供资金支持。 以上对策和建素为:"); for (int i = 0; i < 5; i++) { printf("%d ", arr[i]); 议可以有效推动绿色发展的进程,为保护地球家园,促进人与自然之间 } return 0; } ``` 这段代码中,我们使用了按位异或运算符^和数字1对第二个元素进行操作,将其最低位取反。然后再使用for循环遍历数组输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值