浅谈位运算

    位运算是计算机的底层运算,让计算机来还做是相当快的。

    那么随之而来的就是位运算的运算符,类似于逻辑门电路。


取反

对一个二进制数的每一位进行逻辑去反,符号为 ~。 eg. ~0111(十进制7) = 1000(十进制8)。

但是如果这样写:

printf("%d", ~7);

则会得到-8。但是并没有任何问题。因为每个整数实数变量的第一个二进制位都是用来存符号的,代表这个数的正负。而前面说到取反会对二进制数的每一位进行逻辑取反,所以符号也就反了。因此不妨在前面加一个负号。


按位或

处理两个长度相同的二进制数,若对应二进制数位上的数至少有一个1,则该位的结果为1,符号为|。eg. 0101(十进制5) | 0011(十进制3) = 0111(十进制7)。

printf("%d", 5 | 3);

 就得到了7。


按位异或

处理两个长度相同的二进制数,若对应二进制数位上的数相同,则该位的结果为0;否则为1。符号为^。eg. 0101 ^ 0011 = 0110.

printf("%d",5 ^ 3);

于是得到了6。 

 


按位与

处理两个相同长度的二进制数,若对应二进制数位上的数都为1,则该位的结果为1,否则为0。符号:&。eg. 0101 & 0011 = 0001.

printf("%d", 5 & 3);

输出1.


右移(<<)

将一个二进制数的右边补充0。eg. 1111 << 1 = 11110,1111 << 2 = 111100。右移n位相当于乘2的n次方。

对应的也有左移(>>)的操作,即去掉二进制数的末尾。eg. 1111 >> 1 = 111,1111 >> 2 = 11。左移n位相当于整除2的n次方。

printf("%d ", 15 << 1);
printf("%d", 15 >> 1);

将得到30 7的输出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值