玩一玩那些个二进制的东东~

有一位小朋友(别介意哈~)贴出了这么一道题,某大公司面试,大概意思是这样,对输入的unsigned   int数值进行二进制逆位操作,即最高位与最低位交换,次高位与次低位交换,比如:7(0000   0111)   输出224(1110   0000)?

原文参考点击打开链接,我在49楼做了回复,但是担心以后找不到,所以在这里重啰嗦一遍,不违反相关规定吧?

很佩服那边4楼的大牛,所以也贴一下他的代码,谢谢咯~

unsigned   char   source   =   7;
unsigned   char   target   =   0;
       
for   (int   op   =   0x80;   source   !=   0;   op   /=   2)
{
        (source   &   0x01)   ?   target   =   (target   |   op)   :   target;
        source   =   source   > >   1;
}
       
cout   < <   (int)target   < <   endl;

//   以上是lz不知道8位还是32位的
牛人就是牛人,代码干净利落,人看起来美观,机器执行起来效率也高。

我的代码就不能和牛人的相比了,不过还是贴一下吧,慰藉一下自己 :

/*
相关提示:
	取数置零  与&
	某位  或|
	替换取反  异或^
*/

//本题思路:取最低位,目标左移,原数右移,直至机器位数结束
unsigned int transfer(unsigned int x)
{
	unsigned int y=0;
	unsigned int temp=0;
	for ( unsigned int i=1;i<=128;i<<=1)//在这里设置机器的字长,128(0x80)是8个二进制位的机器
	{
		y=y<<1;//左移
		temp=x&1;//取x的最低位
		if (temp==1)//若是1,就“或”一下
		{
			y=y|temp;
		}
		x=x>>1;//原数右移
	}
	return y;
//注意:y先左移,然后取最低的那位;否则就取不到最低的那位。
}

调用语句

    cout<<"transfer(7)= "<<transfer(7)<<endl;    //224
    cout<<"transfer(224)= "<<transfer(224)<<endl;    //7


其实吧,这道题是书上的,相关信息如下:
C和指针,(美)Kenneth A.Reek著,徐波译,人民邮电出版社,2007
----------------------本题是P89的第3题,原题为----------------------
请编写函数 unsigned int reverse_bits(unsigned int value);
这个函数的返回值是把value的二进制位模式从左到右变换一下之后的值。例如,在32位机器上,25这个值包含下列各个位:
0000 0000 0000 0000 0000 0000 0001 1001  
函数的返回值应该是2 550 136 832,它的二进制位模式是:
1001 1000 0000 0000 0000 0000 0000 0000
编写函数时要注意不要让它依赖于你的机器上整型值的长度
----------------------题目完毕----------------------

----------------------作者给的答案----------------------
对位的技术不使用硬编码,可以避免可移植性问题。这个解决方案使用一个位在一个无符号整数中进行移位来控制创建答案的循环。

/*
**在一个无符号整数值中翻转位的顺序
*/
unsigned int reverse_bits(unsigned int value)
{
	unsigned int answer;
	unsigned int i;
	answer=0;
	/*
	**i不是0就继续进行。这使循环与机器的字长无关,从而避免了可移植性问题
	*/
	for (i=1;i!=0;i<<=1)
	{
		/*
		**把就的answer左移1位,为下一个位留下空间
		**如果value的最后一位是1,answer就与1进行OR操作
		**然后将value右移至下一个位
		*/
		answer<<=1;
		if (value&1)
			answer|=1;
		value>>=1;
	}
	return answer;
}
----------------------作者给的答案,结束----------------------

调用语句

    cout<<"reverse_bits(25)= "<<reverse_bits(25)<<endl;    //2550136832
    cout<<"reverse_bits(2550136832)= "<<reverse_bits(2550136832)<<endl;    //25

微笑结束

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值