某大公司面试题~!

manutd_1878 2007-08-23 07:32:27
大概意思是这样,对输入的unsigned int数值进行二进制逆位操作,即最高位与最低位交换,次高位与次低位交换,比如:7(0000 0111) 输出224(1110 0000)?
...全文
2176 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
shouwangzhe1981 2011-10-24
  • 打赏
  • 举报
回复
如果有循环移位的话,是不是更方便一点。
对于unsigned int 的理解,主要看CPU来和编译工具,无需太认真,只要把原理搞通了,就行了。
jixinazhangdan 2011-10-24
  • 打赏
  • 举报
回复
unsigned Reverse(unsigned uiSource)
{
unsigned ui = 0x1;
unsigned uiDest = 0;
for(int i = 0; i < 32; i++)
{
if(uiSource & (ui << i)) //判断uiSource的第i位是否为1
{
uiDest |= 1 << (31-i);
}

}
return uiDest;
}
jixinazhangdan 2011-10-24
  • 打赏
  • 举报
回复
unsigned Reverse(unsigned uiSource)
{
unsigned ui = 0x1;
unsigned uiDest = 0;
for(int i = 0; i < 32; i++)
{
if(uiSource & (ui << i)) //判断uiSource的第i位是否为1
{
uiDest |= 1 << (31-i);
}

}
return uiDest;
}
oria2011 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 gdujian0119 的回复:]
C/C++ code

s = ((s&0xAAAAAAAA)>>1) | ((s&0x55555555)<<1);
s = ((s&0xCCCCCCCC)>>2) | ((s&0x33333333)<<2);
s = ((s&0xF0F0F0F0)>>4) | ((s&0x0F0F0F0F)<<4);
s = ((s&0xFF00……
[/Quote]

这个确实没有想到过,呵呵
yusss 2011-10-24
  • 打赏
  • 举报
回复
汇编干这事最合适的。。。
孤独小剑 2011-10-24
  • 打赏
  • 举报
回复
s = ((s&0xAAAAAAAA)>>1) | ((s&0x55555555)<<1);
s = ((s&0xCCCCCCCC)>>2) | ((s&0x33333333)<<2);
s = ((s&0xF0F0F0F0)>>4) | ((s&0x0F0F0F0F)<<4);
s = ((s&0xFF00FF00)>>8) | ((s&0x00FF00FF)<<8);
s = ((s&0xFFFF0000)>>16)| ((s&0x0000FFFF)<<16);
测试过了,可用,不过前提是sizeof(int)为4,即32位的。
oria2011 2011-10-24
  • 打赏
  • 举报
回复
#define d_loop_move_32(x) \
(((x & 0x80000000) >> 31) | \
((x & 0x40000000) >> 29) | \
((x & 0x20000000) >> 27) | \
((x & 0x10000000) >> 25) | \
((x & 0x08000000) >> 23) | \
((x & 0x04000000) >> 21) | \
((x & 0x02000000) >> 19) | \
((x & 0x01000000) >> 17) | \
((x & 0x00800000) >> 15) | \
((x & 0x00400000) >> 13) | \
((x & 0x00200000) >> 11) | \
((x & 0x00100000) >> 9) | \
((x & 0x00080000) >> 7) | \
((x & 0x00040000) >> 5) | \
((x & 0x00020000) >> 3) | \
((x & 0x00010000) >> 1) | \
((x & 0x00000001) << 31) | \
((x & 0x00000002) << 29) | \
((x & 0x00000004) << 27) | \
((x & 0x00000008) << 25) | \
((x & 0x00000010) << 23) | \
((x & 0x00000020) << 21) | \
((x & 0x00000040) << 19) | \
((x & 0x00000080) << 17) | \
((x & 0x00000100) << 15) | \
((x & 0x00000200) << 13) | \
((x & 0x00000400) << 11) | \
((x & 0x00000800) << 9) | \
((x & 0x00001000) << 7) | \
((x & 0x00002000) << 5) | \
((x & 0x00004000) << 3) | \
((x & 0x00008000) << 1))
无敌小猫猫 2011-10-24
  • 打赏
  • 举报
回复

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先左移,然后取最低的那位;否则就娶不到最低的那位。
}


取数置零 与&
某位 或|
替换取反 异或^

main()里面

cout<<"transfer(7)="<<transfer(7)<<endl; //224
cout<<"transfer(224)="<<transfer(224)<<endl; //7
无敌小猫猫 2011-10-24
  • 打赏
  • 举报
回复
要求和平台,和编译器无关,是吧?
无敌小猫猫 2011-10-24
  • 打赏
  • 举报
回复
啊!!! 这是书上的原题耶~~~
snow19850628 2007-08-28
  • 打赏
  • 举报
回复
精彩
sniperhuangwei 2007-08-28
  • 打赏
  • 举报
回复
unsigned char swap(unsigned char number)
{

unsigned char low = 0;
unsigned char high = 0;
for(int i = 4 ; i >= 1; --i)
{
unsigned char _low = (8>>(i-1))&number;
unsigned char _high = (128 >> (4-i))&number;
low = low | (_low << (2*i-1));
high = high | (_high >> (2*i-1));
}

return low|high;

}

针对一个字节进行交换的.
lqflyc 2007-08-26
  • 打赏
  • 举报
回复
建立表,以后一个一个慢慢查。哈哈。
seforna 2007-08-26
  • 打赏
  • 举报
回复
unsigned int swap(unsigned int waitingforswap)
{ unsigned int revalue;
int bitsnum=sizeof(waitingforswap)*8;
revalue=0;
for(int i=1;i<=bitsnum/2;i++)
{
revalue|=(1<<(bitsnum-i)&waitingforswap)>>(bitsnum-i+2*(i-1))|((1<<(i-1))&waitingforswap)<<(bitsnum-i+2*(i-1));
}
return revalue;
}
snake1234 2007-08-25
  • 打赏
  • 举报
回复
楼主```我想说的是,你说的是高底位交换,不是高低直接交换.
上面那种方式只是高低字节交换吧,如果把字节和位都没分清楚```明天面视```
manutd_1878 2007-08-24
  • 打赏
  • 举报
回复
To: bargio_susie(平和 自制 审慎)

能解释下你那段代码吗?什么原理?有点看不懂 =.=!
manutd_1878 2007-08-24
  • 打赏
  • 举报
回复
bargio_susie(平和 自制 审慎)

/*每相邻的一个位交换,即1和2,3和4...用数字来表示bit就是87654321交换后就是78563412*/
source = ((source & 0x55) << 1) | ((source & 0xaa) >> 1);

/*每相邻的两个位交换,接着上面78563412交换后就是56781234*/
source = ((source & 0x33) << 2) | ((source & 0xcc) >> 2);

/*每相邻的四个位交换,接着上面56781234交换后就是12345678*/
source = ((source & 0x0f) << 4) | ((source & 0xf0) >> 4);

很好!!希望明天的第二轮面试能顺利过关...
DLMU_net 2007-08-24
  • 打赏
  • 举报
回复
赞jxlczjp77() 和tzwjt2000() 的解法~~~~
学习了~~~
tzwjt2000 2007-08-24
  • 打赏
  • 举报
回复
unsigned int rev(unsigned int n)
{
int nsize; /* 位长 */
unsigned int result;/*结果*/
int i;
nsize = sizeof(unsigned int) * 8;
result = 0;
for (i = 0; i < nsize; i++) {
result |= ((n & (1 << i))? 1 : 0) << (nsize -(i+1));
}
return result;
}
tzwjt2000 2007-08-24
  • 打赏
  • 举报
回复
unsigned int rev(unsigned int n)
{
int nsize; /* 位长 */
unsigned int result;/*结果*/
unsigned bit;
int i;
nsize = sizeof(unsigned int) * 8;
result = 0;
for (i = 0; i < nsize; i++) {
bit = 1 << i;
result |= (n & bit? 1 : 0) << (nsize -(i+1));
}
return result;
}
加载更多回复(33)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧