循环移位
#include "stdafx.h"
void binDis(int data)
{
int i = 32;//表示打印32位的二进制数
while (i--)
{
if (data &(1 << i))
printf("1");
else
printf("0");
if (i % 8 == 0)
putchar(' '); //每打印8位空一个格
}
putchar(10);
}
void circleMove(int *p, int n)
{
n %= 32;//避免转多圈的情况出现
int m; //产生掩码用的
m = n>0 ? n : -n;
unsigned int mask = 0;
while (m--)//判断条件是m没--的值,进入{}下面循环体后就进行了一次--
{
mask |= (1 << m);
}
if (n>0) //左移
{
*p = (*p << n) | ((*p >> sizeof(*p) * 8 - n) & mask);
}
else //右移 凡右移清高位
{
*p = (*p >> (-n))&(~(mask << 32 - (-n))) | (*p << 32 - (-n));
}
}
#if 0
//循环左移
----将1000 0001循环左移1位
1000 0001 <<1 //0000 0010 先实现左移的操作 不管首位溢出
1000 0001 >>7 //1111 1111 若要实现循环移位的话 首位相当于向右移动了n-1位(n为数据总位数)
0000 0001 //根据首位溢出的个数做出相应的掩码mask
1111 1111 & 0000 0001 //将mask与第二步位与 为了保存首位溢出循环到末尾的值 并将其他无关的值清0
0000 0001 | 0000 0010 //将俩个保存移动状态后的数值 位或 得到了循环的数值
0000 0011
----将1011 0001循环左移3位
1011 0001 <<3 //1000 1000
1011 0001 >>5 //1111 1101
1111 1101 & 0000 0111//0000 0101
1000 1000 | 0000 0101
1000 1101
//循环右移
----将1000 0001循环右移一位
1000 0001 >>1 //1100 0000 先将原数据右移
0000 0001 <<7 //1000 0000 将相应的mask向左移n-1位(n为数据总位)
~1000 0000 //0111 1111 将移动后的mask取反
1100 0000 & 0111 1111 //0100 0000 相当于将首位右移后新增的数据清0
1000 0001 <<7 //1000 0000 将原数据左移动n-1位
10000 0000 | 0100 0000 //俩种保存的状态信息位或得到结果
#endif
int _tmain(int argc, _TCHAR* argv[])
{
int a = 1 << 31 | 1 << 0;
binDis(a);
circleMove(&a, 2);
binDis(a);
return 0;
}