移位运算符:左移运算符<<
、右移运算符>>
左移运算符<<
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
右移运算符>>
按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
C语言移位运算只针对于整数。
下面以一个C函数举例
int wordAgliment(int x) {
return (x+7) >> 3 << 3;
}
分析一下这个函数
当输入 x = 5
x+7 = 12
12 用二进制表示为
0000 1100
右移三位变成
0000 0001
再左移三位变成
0000 1000
这个函数的结果为 8
即:输入x=5,得到的值为8
同理:
x=15,
x+7 = 22
22用二进制表示为:
0001 0110
右移三位变成
0000 0010
再左移三位变成
0001 0000
这个函数的运行结果为 16
即:输入的x=15,得到的值为16
可以总结一下规律:
一个数k为2的m次方,输入一个x,经过下面的移位运算得到的结果是对x进行向上取整为k的整数倍。
(x+ k-1) >> m << m
举例验证
如果k=8,k-1=7,8是2的3次方,即m=3,即得到
(x+7) >> 3 << 3
输入的x经过这种位移处理后的,会向上取8的倍数,例如输入5 ——> 结果取8,输入15 ——> 结果取16
如果k=16,k-1=15,16是2的4次方,即m=4,即得到
(x+15) >> 4 << 4
输入的x经过这种位移处理后的,会向上取16的倍数,例如输入5 ——> 结果取16,输入22 ——> 结果取32