循环移位(c语言)
移位运算符
符号 含义 << 左移位 >> 右移位
举例(32位ubuntu系统,unsigned short int 16bit)
#include <stdio.h> #include <stdlib.h> void intTobinary(unsigned int); int main() { unsigned short int a = 15; int i; //首先a左移2位 intTobinary(a); intTobinary(a << 2); } /** * Description:将整数的二进制显示出来 */ void intTobinary(unsigned int a) { int binary[16] = {0}; int temp, i; for(i = 0; a; i ++) { binary[i] = a % 2; a /= 2; } for(i = 15; i >= 0; i --) { printf("%d", binary[i]); } printf("\n"); }
结果:
补充:
无符号整数在移位的过程中一般都是补0
注意:
移位运算符的优先级比算数运算符的优先级低!
按位求反、按位与、按位异或、按位或
符号 含义 ~ 按位求反 & 按位与 ^ 按位异或 | 按位或
循环移位
8bit的 a = 01111011, 循环左移2位,正确的结果是: 11101101
过程:
- 变量 b = a >> (8 -2),用b来得到正常左移丢失的位和循环位移之后其正确的位置 b = 00000011
- a 正常左移2位,a << 2, a = 10110100
- 循环左移的结果a = a | b; a = 10110111
公式
- 在数据类型长度N
- a循环左移n位,a = (a >> (N - n) | a << n)
- a循环右移n位,a = (a << (N - n) | a >> n)