欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言 位运算

程序员文章站 2022-07-15 08:52:23
...

计算机的变量是如何存储在内存里的?


本文例子复制自文章: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


**

注意事项:

**
位运算不适用于实数,仅仅适用于整数与字符。

如果进行位运算的数的类型不同,那么会自动进行类型转换(小类型转换成大类型)

如果进行位运算的为无符号常量或变量,那么会连符号位一起运算。