原文参考点击打开链接,我在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
结束