C/C++操作符:按位与、按位或、按位异或、左移、右移及拓展应用

本文详细解释了&、^、|三个二进制运算符的工作原理,以及左移(<<)和右移(>>)操作在计算机中的应用。还介绍了如何利用n-1操作符计算整数中1的个数和不使用中间变量交换数值的方法。
摘要由CSDN通过智能技术生成

1. &  |   ^

这三个操作符都是通过2进制进行运算的  

&  按位与  在二进制中   在相同权重处0 & 0 =0 , 0 &1 = 0,1 & 1=1 

例如,

12的二进制数:00001100

13的二进制数:00001101

12      &     13=00001100

|    按位或  在运算过程中 相同权重处 0 | 0 =0,1 |1=1,0 | 1=1 

12的二进制数:00001100

13的二进制数:00001101

12      |     13=00001101

^   按位异或 在相同权重处  0 ^ 0=1,1 ^ 0= 1 ,0 ^ 1=1

12的二进制数:00001100

13的二进制数:00001101

12      ^     13=00000001

<<  表示左移操作符   他的使用简单明了   由于 数字在电脑中是以二进制的补码存储的  <<操作符表示将  数字在电脑中的补码补码向左移动一位 空出的一位补零  例如:

m<<k  标识 m的补码向左移动k位(特别提醒移动的是补码,我们使用的是原码)

>>表示右移操作符   右移包括两种:

1 . 逻辑右移 :简单粗暴补码向右移动一位空位补 0 。

2 . 算数右移 :补码向右移动一位,空位补符号位。

例如:

逻辑右移:

int  a =8;//a的补码为00000000000000000000000000001000   

int b = a>>1;向右移动一位后为00000000000000000000000000000100   

由于正数的原码,反码,补码一致所以b 的值即为4;

负数根据这种元素过程,将补码转化为原码即为所求的值,但所得到值的规律与正数有所不同。

算数右移:

//正数的两种右移方式所得到的值相同这里就不过多介绍

//我们以-1进行介绍

int a = -1; 

int b = a>>1;

//-1的补码为11111111111111111111111111111111

//根据运算规则向右移动一位空出的一位补符号位可得:

//11111111111111111111111111111111

//在使用时我们用的是补码所以,b的值就为 -1;

几类操作符的应用:

1.n=n&(n-1)

如果想要在一个整形数据中找到该整形数值在内存中的存储(补码)中 1个数可用此公式,原理是 n每与n - 1 相与再赋值给当n = 0是不再计算,就可以除去n中(补码)的一个 1 再进行计数即可得出 1 的个数:

int n  = 100;

int count =0 ;

while((n&(n-1))!=0 ){

count++;

n=n&(n-1);

}

计算 1 的个数还有其他的方式在这里就不过多介绍了;

2.下面我们来介绍 如何不创建中间变量来交换两个数的值:

int a=10;

int b = 20;

a = a^b;

b = a^b;

a = a^b;

是不是感觉一脸懵?刚开始我也是这种感觉但是明白了其中的原理就非常简单了,下面我们就来介绍他的基本原理。

在这个代码中第一个a仅仅起到了中作用,在“按位异或”运算符中 a^a等于什么呢?很明显是 0 ;关键的来了0 ^ n这个数还是n,大家可以仔细想想 ^ 的作用,是不是突然茅塞顿开。

这时 b = a^b就等于 b = a^b^b;这个值就为 a;下面的a也是一样方式,a与b的值就这样完成了互换。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熬到半夜敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值