移位操作符 (>>右移操作符 <<左移操作符)
右移操作符分为:1.算术右移 (右边丢弃,左边补原符号位)2.逻辑右移(右边丢弃,左边补0)相当于除二操作
左移操作符:左边丢弃,右边补零,左移除二效果
移位操作符只能作用于整数
int main() {
int a = 16;
//>> 右移操作符
//移动的是二进制位
int b = a >> 1;
printf("b=%d", b);//b=8
a = -1;
b = a >> 1;
printf("b=%d", b);
return 0;
//右移操作符:
//1.算术右移
// 右边丢弃,左边补原符号位
//2.逻辑右移
// 右边丢弃,左边补零
//整数的二进制表示有:原码、反码、补码
//存储到内存的是补码
//10000000 00000000 00000000 00000001 原码
//11111111 11111111 11111111 11111110反码
//11111111 11111111 11111111 11111111补码
// 1111111 11111111 11111111 111111111 右移一位,左边补原符号位1
}
int main() {
int a = 5;
int b = a << 1;
//00000000 00000000 00000000 00000101
//0000000 00000000 00000000 000001010
//左边丢弃,右边补零
//右移除二效果,左移乘二效果
printf("b=%d", b);//b=10
return 0;
}
按位与&、按位或|、按位异或^(同0异1)
int main() {
int a = 3;
int b = 5;
int c = a & b;
//00000000 00000000 00000000 00000011
//00000000 00000000 00000000 00000101
//按位与后得
//00000000 00000000 00000000 00000001
printf("c=%d",c);//c=1
c = a | b;
//00000000 00000000 00000000 00000011
//00000000 00000000 00000000 00000101
//按位或后得
//00000000 00000000 00000000 00000111
printf("c=%d", c);//c=7
c = a ^ b;
//00000000 00000000 00000000 00000011
//00000000 00000000 00000000 00000101
//按位异或后得
//00000000 00000000 00000000 00000110
//同零异一
printf("c=%d", c);//c=6
return 0;
}
接下来看几道题目吧
代码实现交换两个int值,要求:不能使用第三个变量。
方法一:加减法(有缺陷,会溢出)
a = a + b;
b = a - b;
a = a - b;
方法二:异或(可读性差,执行效率低)
//a=3,b=5
a = a ^ b;
//011^101=110
b = a ^ b;
//110^101=011
a = a ^ b;
//110^011=101
return 0;
实际上我们平时写代码的时候并不会用加减法和异或方法去交换两个数值,最好的方法其实是利用第三个变量tmp来交换
来看第二道题吧
求一个整数存储在内存中得二进制中1的个数
方法一:模二算法(遇见负数会出现问题)
while (num)//不等于0说明二进制序列中还有1
{
if (num % 2 == 1)
count++;
num = num / 2;
}
方法二:移位+异或
//例如把3和1异或后得1说明3的二进制序列中最后一位是1
//00000000 00000000 00000000 00000011
//00000000 00000000 00000000 00000001
//00000000 00000000 00000000 00000001
int i = 0;
for (i = 0; i < 32; i++)
{
if (1 == ((num >> i) & 1)){
count++;
}
}
}
下面了解一下单目操作符有哪些吧
! - + & sizeof ~ (对一个数的二进制按位取反) -- ++ * ()强制类型转换