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的值就这样完成了互换。