位元 字组 二进制运算 以及 编码

字组就是把一个数的二进制的各位看成数组~~

<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删除

待续~~

原文地址:https://www.cnblogs.com/hxer/p/5217841.html