二进制的位运算有哪些?
(1).按位and运算&
(2).按位or运算|
(3).按位异或运算^
(4).取反运算~
(5).左移运算<<
(6).右移运算>>
1.and运算&
and运算通常用于二进制取位操作。例如:n&1的结果就是取二进制的最末位,用来判断一个整数的奇偶,二进制最末位为0表示为偶数,为1表示为奇数。
运算方法:有0得0,否则为1.
例如:00001001
& 00010101
———————
00000001
2.or运算|
or运算通常用于二进制特定位赋值操作。例如:n|1的结果就是把二进制最末位强行改变成1,如果要把最末位变成0,对这个数or运算后减1即可。
运算方法:有1得1,否则为0.
例如:01101010
| 00110111
——————
01111111
3.异或运算^:
按位异或运算,对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作,操作结果是如果某位不同则该位为1,否则为0.异或运算的逆运算是它本身,即就是两次异或同一个数最后结果不变。
异或运算可以用于简单的加密,比如说,我想对我喜欢的人说5201314,但又不想别人知道,于是双方约定一个密码19951204. 5201314^951204=5234598,我把5234598告诉他,他计算5234598^951204,得到5201314,于是他就明白了我的意思,我们就这样悄悄的传递了甜言蜜语,是不是很棒。
运算方法:相同为0,不同为1.
例如:10101001
^ 01011111
__________
11110110
此外,通过异或运算也可以很方便去实现两数的交换。
代码:a = a^b;
b = b^a;
a = a^b;
4.not运算~(取反运算)
not运算是把内存中的0和1全部取反,使用not运算要区分无符号整形数和有符号整形数。
二进制数在内存中以补码的形式存储。
按位取反:二进制每一位取反,0变1,1变0.
例如:a=9;则~a=? a=-9;则~a=?
先把9转为二进制:00001001 先把-9转为二进制:10001001
补码:00001001 补码:11110111(取反加1)
按位取反:11110110 按位取反:00001000
转为原码: 转为原码:
取反:10001001 正数补码和原码相同,
末位加一:10001010 (-10) 也为00001000(8)
答案为-10 答案为8
5.左移运算:
左移运算就是把一个二进制数左移相对的的位数,右边用0补齐即可。
例如:100<<2;
100转换成二进制数为:000001100100
左移两位得到:000110010000(对应十进制数为400)
可以看出,左移就是100*pow(2,2),因为在后面添一个0实际上就是相当于*2.
6.右移运算:
右移运算就是把一个二进制数右移相对的的位数,左边用0或1补齐即可。
右移运算分为逻辑移位和算术移位,逻辑移位的话,左边根据二进制数的正负,正数用全0补齐即可,负数最高为不1,其余补0即可,算术移位就是把一个二进制数右移相对的的位数,左边用0补齐即可。
例如:逻辑移位:100>>2;
100转换成二进制数为:000001100100
右移两位得到:000000011001(对应十进制数为25)
可以看出,算术左移就是100/(pow(2,2)),因为在前面添几个0实际上就是相当于除2.
算术移位:100>>2;
100转换成二进制数为:100001100100
右移两位得到: 1111111111001