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


**

注意事项:

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

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

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值