移位操作
C语言中的移位运算符:左移(<<)、右移(>>),移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)。
逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充。
算术移位:移出去的位丢弃,空缺位(vacant bit)用“符号位”来填充,所以一般用在右移运算中。
循环移位:将移出去的位依次填充到空缺位。
循环移位实现
// unsigned char 循环左右移位一位
#define CYCLE_LSHIFT_ABIT(data) ((unsigned char)((data >> 7) | (data << 1)))
#define CYCLE_RSHIFT_ABIT(data) ((unsigned char)((data << 7) | (data >> 1)))
// 任意类型循环左右移位一位
#define CYCLE_LSHIFT_ABIT_TYPE(data, type) ((type)((data >> (sizeof(type) << 3) - 1) | (data << 1)))
#define CYCLE_RSHIFT_ABIT_TYPE(data, type) ((type)((data << (sizeof(type) << 3) - 1) | (data >> 1)))
// 任意类型循环左右移位n位
#define CYCLE_LSHIFT_NBIT_TYPE(data, nbit, type) ((type)((data >> (sizeof(type) << 3) - nbit) | (data << nbit)))
#define CYCLE_RSHIFT_NBIT_TYPE(data, nbit, type) ((type)((data << (sizeof(type) << 3) - nbit) | (data >> nbit)))