1、移位操作符
// << 左移操作符
// >> 右移操作符
// 移位操作符的操作数只能是整数
// 移位操作符,移动的是二进制位(存储在内存中的补码)
// 移位操作符应避免移动负数位(该标准未定义)
2、位操作符
// &(按位与)
// 补码按位有0为0,同1为1
// |(按位或)
// 补码按位有1为1,同0为0
// ^(按位异或)(异或支持交换律)
// 补码按位,相同为0,相异为1
// 操作数必须为整数
// ~(按位取反)
// 补码按位取反
3、整型的二进制表示
// 原码、反码、补码
// 整数在内存中存储的是二进制的补码
// 符号位是0,表示正数(正整数的原码、反码、补码相同)
// 符号位是1,表示负数
// 反码:(原码的符号位不变,其他位按位取反)
// 补码:(反码+1)
4、移位运算题:不使用累计乘法的基础上,通过移位运算(<<)实现2的n次方的计算
#include<stdio.h>
int main(void)
{
int num;
int p;
while (scanf("%d", &num)) {
p = 1 << num;
printf("%d\n",p);
}
return 0;
}
其中移位运算包括左移和右移 |
-
左移运算:x<<k:x左移k位,并在右端补零
-
右移运算(逻辑):x>>k:x右移k位,并在左端补零
-
右移运算(算术):a.x>>k:x右移k位,并在左端补零(注意:此时符号位应为0,即正)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ b.x>>k:x右移k位,并在左端补1(注意:此时符号应为1,即负)
参数x | 10010101 |
---|---|
x<<2 | 01010100 |
x>>2(逻辑) | 00100101 |
x>>2(算术) | 11100101 |
位运算题:不能创建临时变量(第三个变量),实现两个数的交换
// a^a=0
// a^0=a
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
a = a ^ b;
b = a ^ b; // a^b^a
a = a ^ b; // a^b^a
return 0;
}