字组就是把一个数的二进制的各位看成数组~~
<1>计算机中的反码与补码;
最高位:正数为0,负数为1;
正整数的原码,反码,补码均相同;
负数的反码:符号位不变,在原码的基础之上数值位取反;
负数的补码:求出反码后加1;如-1(只看8位);原码:1000 0001 反码:1111 1110 补码:1111 1111; //在使用scanf()输入到EOF时返回-1;这是我们可以使用位取反运算符变为0,即将所有(包括符号位)的1变为0~~
<2>位运算
1.把字组中最靠右的1变为0: 如 0101 1110 => 0101 1100
x & (x - 1);
2.取出字组中最靠右的1 (数值不是第几位): 如 1010 0100 => 0000 0100
x & (-x); // 树状数组中的lowbit()
3.最低位0变为1: 如 1010 0111 => 1010 1111
x|(x+1) //x+1具有递推性
4.把字组尾部的1都变成0:如1010 0111 => 1010 0000
x & (x + 1) //删除用 &
5.把字组尾部的0变为1:如 1010 1000 => 1010 1111
x | (x - 1) //添加用 |
6.把字组中最靠右且值为0的位元变为1,其余位元置0; 如 1010 0111 => 0000 1000
~x & (x + 1) //注意取反
7.把字组中最靠右且值为1的位元变为0,其余位元置1;如 1010 1000 => 1111 0111
~x | (x - 1) // x - 1只是将x的最低为1的位元置0;并且把尾部为0的位元变为1
8.把字组尾部为0的位元置1,其余位元置0;如 1010 1000 = > 0000 0111
~x & (x - 1) 可以发挥处理器的某些指令级优化,还可以使用 (x & -x) - 1
9.把尾部的所有值为1的位元都变成0,其他位都置为1;如 1010 0111 => 1111 1000
~x | (x+1)
10.把最靠右且值为0的位元及其右方所有值为1的位元都置为1,其他位元设为0;如 0101 0111 = > 0000 1111
x ^ (x + 1) // xor同样能把原数中的字组1删除
待续~~