位运算:
用于对整数类型(int, char, long等)(double和float类型不可用) 变量中的某一位(bit), 或者若干位进行操作。比如:
1) 判断某一位是否为1
2) 只改变其中某一位,而保持其他位都不变
C/C++语言中有六种位运算符来进行位运算操作(操作补码):
& 按位与(双目)
| 按位或(双目)
^ 按位异或(双目)
~ 按位非(取反)(单目)
<< 左移(双目)
>> 右移(双目)
"&"运算符:
通常用来将某变量中某些位清0且同时保留其他位不变。
也可以用来获取某变量中的某一位。
例如,如果需要将int型变量n的低8位全置变成0,而其余位不变,则可以执行:
n = n & 0xffffff00; 或
n &= 0xffffff00;
如果n是short类型的,则只需执行:
n &= 0xff00;
例如,判断一个int型变量n的第7位(从右往左,从0开始数)是否为1?
只需看表达式“n & 0x80”的值是否等于0x80即可。
0x80: 1000 0000
"|"运算符:
按位或运算通常用来将某变量中的某些位置1且保留其他位不变。
例如,如果需要将int型变量n的低8位全置成1,而其余位不变,则可以执行:
n |= 0xff;
0xff: 1111 1111
"^"运算符:
按位异或运算通常用来将某变量中的某些位取反,且保留其他位不变。
例如,如果需要将int型变量n的低8位取反,而其余位不变,则可以执行:
n ^= 0xff;
0xff: 1111 1111
在136. Single Number 解题记录中用运用到"^"运算符来进行解题。
"<<"运算符:
表达式:
a << b
的值是:将a各二进位全部左移b位后得到的值。左移时,高位丢弃,低位补0。a的值不因运算而改变。
实际上,左移1位,就等于是乘以2,左移n位,就等于是乘以2n。而左移操作比乘法操作快得多。
">>"运算符:
表达式:
a >> b
的值是:将a各二进位全部右移b位后得到的值。右移时,移出最右边的位就被丢弃。a的值不因运算而改变。
对于有符号数,如long,int,short,char类型变量,在右移时,符号位(即最高位)将一起移动,并且大多数C/C++编译器规定,如果原符号位为1,则右移时高位就补充1,原符号位为0,则右移时高位补充0。
实际上,右移n位,就相当于左操作数除以2n,并且将结果往小里取整。
-25 >> 4 = -2
-2 >> 4 = -1
18 >> 4 = 1