在学编程语言的时候,位运算符老师讲的很少,但是在刷ACM的时候还是会经常出现的,今天就做一下小结:
原码,反码和补码的概念:
数在计算机中是以二进制形式表示的,数分为有符号数和无符号数,原码、反码、补码都是有符号定点数的表示方法,
一个有符号定点数的最高位为符号位,0是正,1是负。
正数的反码和补码都是和原码相同,负数的反码是将其原码除符号位之外的各位求反 ,负数的补码=反码+1。
eg:
数 | 原码 | 反码 | 补码 |
---|---|---|---|
3 | 0000 0011 | 0000 0011 | 0000 0011 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
<<和>>运算符:
>>运算符:将数化为二进制形式,然后向右移产生会空位,产生的空位根据高位来补。如果高位是0,则空位补0,若是1,则补1。
eg:
3>>2:3原码(0000 0011) ==》 右移两位产生两个空位( 00 0000)==》高位为0则空位补0(0000 0000)此时可根据该码直将二进制数化为十进制数得出结果,即3>>2=0
-3>>2: -3原码(1000 0011) ==》补码(1111 1101)==》 右移两位产生两个空位( 11 1111)==》高位为1则空位补1(1111 1111)
此时不可根据该码直接求十进制数,而是化为该码对应的原码,再根据原码将二进制数化为十进制数,即化为原码为(1000 0001)则-3>>2= -1
<<运算符:将数化为二进制形式,然后向左移产生会空位,右边空出的位用0填补,高位左移溢出则舍弃该高位。
eg:
-3<<2:-3原码(1000 0011) ==》-3补码(1111 1101) ==》左移两位产生两个空位( 1111 01 )==》空位补0(1111 0100)
此时不可根据该码直接求十进制数,而是化为该码对应的原码,再根据原码将二进制数化为十进制数,即化为原码为(1000 1100)则-3>>2= -12
<<<和>>>运算符:
<<<运算符:无符号左移运算符,忽略了符号位扩展,0补最高位
>>>运算符:无符号右移规则和右移运算是一样的,只是填充时不管左边的数字是正是负都用0来填充,无符号右移运算只针对负数计算,因为对于正数来说这种运算没有意义
&,|和 ∧运算符
&运算符: 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。(与)
eg:
3&5 0011
& 0101
————————
0001
即3&5=1
|运算符:两个相应的二进制位中只要有一个为1,该位的结果值为1。(或)
eg:
3|5 0011
| 0101
————————
0111
即3|5=7
^ 运算符: 若参加运算的两个二进制位值相同则为0,否则为1(异或)
eg:
3^5
0011
^ 0101
————————
0110
即:3^5=6