按位运算符
按位运算符对整数值的位进行操作。C++中一共有6中按位运算符:“<<”,“>>”,“~”,“&”,“|”,“^”。
1.移位运算符
value是要被操作的数值,shift是要移动的位数。
左移:value<<shift 腾出的位置用‘0’填充,如:13<<3,将13的每一位都向左移3位。
右移:value>>shift 对于无符号整数,腾出的位置用‘0’填充,右边超出边界的位被删掉;对于有符号的整数,腾出的位置有可能用‘0’填充,也可能用原来最左边的位上的数填充。如:13>>3,将13的每一位都向右移3位;
因为每个位都是右边一位的2倍,所以左移一位相当于乘以2,左移n位相当于乘以2^n, 右移一位等于除以2,右移n位相当于除以2^n。
!
移位运算符在C++中会新生成一个值,不会改变原值。(汇编语言中会直接修改寄存器内容)
如果要改变原值还是要用赋值符号,例:x=x<<4; x<<=4;
2.逻辑按位运算符
逻辑运算符作用于值的每一位,而不是整个值。
-
!(非运算符):运算符将非零值(或true)转为false,将false转为true;
-
~ (求反运算符):将每一位转为它的反面(1转为0,0转为1);
例:unsigned char x=3;
!x=0,将非零值转为false;
~x计算时,先写出二进制形式:00000011,再把每个0转为1,每个1转为0,二进制形式改为:11111100,在十进制中表示252。求反运算得到的新值是原值的补值。 -
|(OR运算符):对两个整数值进行操作,生成一个新的整数值。每一位与对应位进行或运算。
-
^(XOR运算符):对两个整数值进行操作,生成一个新的整数值。每一位与对应位进行异或运算。
- 异或的规律:
x ^ 0 = x;//任何数异或0等于自身 x ^ (~x) = 1;//任何数与自己的非异或等于1; x ^ x = 0;//任何数和自身异或等于0; c = a ^ b,有:a ^ c = b 或 b ^ c = a; a ^ b ^ c = (a ^ b) ^ c = a ^ (b ^ c);
-
&(AND运算符):对两个整数值进行操作,生成一个新的整数值。每一位与对应位进行与运算。
3.位运算的小技巧
-
n&(n-1)运算结果是:把n的二进制位中最低位的1变为0之后的数
如:6&(6-1)=4 ;6的二进制表示:110,4的二进制表示:100。【应用:力扣剑指 Offer 15. 二进制中1的个数】 -
x ^ 0 = x 、 x ^ (~x) = 1。【应用:剑指 Offer 53 - II. 0~n-1中缺失的数字,剑指 Offer 56 - I. 数组中数字出现的次数】
-
无进位加法:a&b,有进位加法:(a&b)<<1;【应用:剑指 Offer 65. 不用加减乘除做加法】
-
(x>>n)&1,获得第n位的值;
-
n&(n-1)==0 则n为2的幂。
个人学习总结,侵删,有错请指出。