C语言:位运算
位运算
<<:左移,按位左移
说明:原操作数所有的二进制位数向左整体移动指定位。(小端模式下:高舍低补)
无符号左移
语法:
操作数 << 移动位数
举例:
unsigned char a = 3 << 3; // 24 将3左移3位,可以套用公式:3 * 2 ^ 3unsigned int b = 5 << 4; // 80 将5左移4位,可以套用公式:5 * 2 ^ 4
有符号左移
语法:
操作数 << 移动位数
举例:
int a = -3 << 3; // -24 将3左移3位,可以套用公式:-3 * 2 ^ 3int a = 240 << 2; // 960 将3左移3位,可以套用公式:240 * 2 ^ 2
注意:
如果符号位被覆盖或者一处高位全为1时溢出或者极端溢出时,公式不适用,其他使用都可以使用公式:
>>:右移,按位右移
说明:原操作数所有的二进制数据整体向右移动指定位,移动的数据舍弃。(高补低舍)
如果操作数是无符号数:左边用0补齐
如果操作数是有符号数:左边用什么补全,取决于计算机系统
逻辑右移:用0补全
算数右移:==由符号位决定补什么,符号位是1,就用1来补全,如果符号位是0,就用0来补全
大部分情况下,系统都遵循“算数右移”;
无符号右移
语法:
操作数 >> 移动位数
举例:
ubsigned char a = 3 >> 3; // 0
演示:
有符号右移
语法:
操作数 >> 移动位数
举例:
char a = 3 >> 3; // -1
演示:
关于移位运算过程:
原数据 → 二进制原码 → 二进制反码 → 二进制补码 → 移位运算 → 二进制反码 → 二进制原码 → 特定进制数据