C语言 位运算
计算机的变量是如何存储在内存里的?
本文例子复制自文章:https://blog.csdn.net/mengzhengjie/article/details/80611422
首先如果你定义了一个变量并赋值了一个变量a
int a=20;
它在内存中的存储形式是以二进制的形式来存储的,那么它的值是10100.
(正数是以二进制的形式存储,负数是以二进制补码的形式存储)
关于二进制与十进制的转换,不懂的可以查百度,这里就不多说了。
C语言的位运算符有六个:
按位与 & :
在1与0的&运算中,只有1&1=1,其他的都得0.
将10与-10进行按位与(&)运算:
0000 0000 0000 1010
1111 1111 1111 0110
-----------------------
0000 0000 0000 0010
所以:10 & -10 = 0000 0000 0000 0010
按位或 | :
在1与0的|运算中,只有0|0=0,其他都得1
将10与-10进行按位或(|)运算:
0000 0000 0000 1010
1111 1111 1111 0110
-----------------------
1111 1111 1111 1110
所以:10 | -10 = 1111 1111 1111 1110
按位异或 ^ :
在1与0的^运算中,两个相同的数相互^都等于0,不同的数相互^都为1
将10与-10进行按位异或(^)运算:
0000 0000 0000 1010
1111 1111 1111 0110
-----------------------
1111 1111 1111 1100
所以:10 ^ -10 = 1111 1111 1111 1100
取反 ~ :
也就是将二进制的0变成1 , 1变成0,。
对10进行取反(~)运算:
0000 0000 0000 1010
---------------------
1111 1111 1111 0101
所以:~10 = 1111 1111 1111 0101
左移 <<:
将二进制向左运算N个位数。
对10左移2位:
0000 0000 0000 1010
--------------------
0000 0000 0010 1000
所以:10 << 2 = 0000 0000 0010 1000 = 40
右移 >> :
将二进制向右运算N个位数。
对10右移2位(就相当于在左边加2个0):
0000 0000 0000 1010
--------------------
0000 0000 0000 0010
所以:10 >> 2 = 0000 0000 0000 0010 = 2
左移一位相当于 x2 ,右移一位相当于 ÷2
不管是右移还是左移,如果越界了就会被抛弃,然后自己的位会被填充。
左移: 填充0
右移: 无符号:填充0 , 有符号: 正数填充0,负数填充1
**
注意事项:
**
位运算不适用于实数,仅仅适用于整数与字符。
如果进行位运算的数的类型不同,那么会自动进行类型转换(小类型转换成大类型)
如果进行位运算的为无符号常量或变量,那么会连符号位一起运算。