循环移位

循环移位

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值