所谓位运算是指进行二进制位的运算。C语言提供了如下的位运算符:
运算符 |
含 义 |
举 例 |
& |
按位与 |
a&b,a和b中各位按位进行“与”运算 |
| |
按位或 |
a|b,a和b中各位按位进行“或”运算 |
^ |
按位异或 |
a^b,a和b中各位按位进行“异或”运算 |
~ |
取反 |
~a,a中各位按位进行“取反”运算 |
<< |
左移 |
a<<n,a中各位全部左移n位 |
>> |
右移 |
a>>n,a中各位全部右移n位 |
1.1.1 按位与运算符
基本格式:a&b
基本规则:0&0 = 0 0&1 = 0 1&0 = 0 1&1 = 1 (即,只有1&1为1,其他为0)
作用:
将某些位清零:想要清除哪一位,就与上对应的那一位为0.
eg: 00101011想要清除低3位,则&上11111000. 变成00101000
取指定位:想要取哪一位,就与上对应那一位为1.
eg:00101011想要取出低3为,则&上00000111. 变成00000011
1.1.2 按位或运算符
基本格式:a|b
基本规则:0|0 = 0 0|1 = 1 1|0 = 1 1|1 = 1 (即,只有0|0为0,其他为1)
作用:
设定某些位为1:想要设置哪一位为1,就或上对应的那一位为1.
eg:00101011想要将第4位设置为1,则|上00010000,变成00111011
1.1.3 异或运算符
基本格式:a^b
基本规则:0^0 = 0 0^1 = 1 1^0 = 1 1^1 = 0 (即“相同为0,相异为1”)
作用:
使特定位翻转:想要将哪些位翻转,就异或上对应的哪些位为1.
eg:00101011想要将低4位翻转,则^上00001111,变成00100100
和0相异或,保留原值
eg:00101011^00000000,还是00101011
1.1.4 取反运算符
基本格式:~a
基本规则:~0 = 1 ~1 = 0
作用:
结合&可以将一个数的指定位清0.
eg:a=00101011,如果a&=~1,则将a的最低位清0
一个数a按位取反之后的值为a的相反数-1
1.1.5 左移运算符
基本格式:a << n (n为整数)
基本规则:将一个数的各二进制位全部左移若干位。(左丢弃,右补0)
举例:x=01010001,x << 2,则x=01000100
作用:
在左移时被溢出舍弃的高位中不包含1的情况时,左移一位相当于该数乘以2。依此类推
1.1.6 右移运算符
基本格式:a >> n (n为整数)
基本规则:将一个数的各二进制位全部右移若干位。(正数左补0,负数左补1,右丢弃)
举例: x=00101111,x >> 2,则x=00001011
x=10110010,x >> 2,则x=11101100
作用:
在右移时被溢出舍弃的低位中不包含1的情况时,右移一位相当于该数除以2。依次类推