由于大一学习C语言的时候在位运算这块老师是简单提了下,所以当时一直没在意这个东西,觉得没什么用处。今天在数据结构习题集上碰到一到题目,设计到了异或运算,顺便把位运算整个整理一下。
c语言中给出的位运算有位与运算、位或运算、位异或运算、左移运算以及右移运算。
按照“如果同为1则结果为1否则为0”的原则逐位求与运算。(注意这里是相对于二进制的每一位而言的)
例如:9&2=9(00001001)&5(00000101)=1(00000001)。
1)与运算可以用来实现特定位的清零工作(只需将清零位置置0,其余位置置1)。
例如:10011010,需要将高4位清零,可以让此数字和00001111做与运算即可。
2)可以取得特定的位(只需将待取位置1,其余位置0)。
例如:00011101,想要取到第5位,只需和00010000做与运算即可。
按照“如果同为0则结果为0否则为1”的原则逐位求或运算。
例如:3|2=3(00000011)|2(00000010)=3(00000011)。
1)可以将操作数中的特定位置1。
按照“同0异1(即同为0或者同为1时为0否则为1)”的原则逐位求异或运算。
例如:5^7=5(00000101)^7(00000111)=2(00000010)。
1)使特定位的值取反(只需将需取反的位置1,其余为0)。
例如:00101101后4位取反,只需跟00001111求异或运算即可
2)不引入第三变量交换两个变量的值。
a=a^b;b=a^b;a=a^b;(这里注意原因是这样的:a^(a^b)=(a^a)^b=b;b^(a^b)=(b^b)^a=a;)
从整数的角度是很好理解的:a^a为0再^b结果肯定为b(0与任何位求异或,位不变:0^1=1,0^0=0),而
a^(a^b)=b可以从一个表格理解:
a
b
结果
0
0
0
0
1
1
1
1
0
1
0
1
从表格可以看出,单位求异或后用结果与操作数相异或即可得到另一操作数,那么把单位推广到多位即可理解了。(这个我在今天的数据结构题集中遇到了此问题,算是理解了
)
形如a<
例如:4<<2=8,00000100全部左移1位即00001000。
形如a>>b的二目运算符,将a操作数的各位全部右移b位,低位丢弃,区别于左移运算如果为负数则高位补1,如果为正数则补0.
例如:-3>>2=-96 10000011(-3)>>2=11100000(-96)