目录
1.对二进制位 置1
如何对一个数的指定二进制位置1呢?
①了解一个数在内存中的存储
一个整数在内存中的存储是以补码的形式存在的,
其中正整数的原码,反码,补码三码相同
反码是原码的符号位(最高位为符号位)不变,其他位按位取反
补码是反码+1。
而负数的原码,反码,补码需要计算
例如:
int a = -1;
10000000000000000000000000000001 - 原码
11111111111111111111111111111110 - 反码
11111111111111111111111111111111 - 补码
② 如何对一个数的指定二进制位置1呢?
例如:
int a = 13;
13的二进制位为
00000000000000000000000000001101
如果我要将倒数第5位置于1,则只需要将这个二进制位同
00000000000000000000000000010000 这个数的二进制位按位或就可以了
00000000000000000000000000011101
所以就可以得到:
将倒数第n位的二进制改为1,只需要将1的二进制位左移n-1位再和自身按位或
a |= (1 << 4);
2.对二进制位置0
如何对一个数的指定二进制位 置0呢?
例如:
00000000000000000000000000011101 - 29
改为
00000000000000000000000000001101 - 13
则只需要将
00000000000000000000000000011101 按位与上这个数
11111111111111111111111111101111 就得到了
00000000000000000000000000001101
但是这个数
11111111111111111111111111101111
怎么来的呢
就是
00000000000000000000000000010000 按位取反就可以了 ~
所以就可以得到:
将倒数第n位改成0,只需要将1左移n-1位按位取反再和自身按位与
a &= (~(1 << 4));