如何将32位INT整数bit位转序(急)

lazyter1 2005-10-17 10:15:55
如:0011 -〉1100
不过int 是32位的
一定给分。

...全文
868 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
prove_wj 2005-10-18
  • 打赏
  • 举报
回复
unsigned int len=32,dest=0,bit=1,i;
unsigned int src=0x55555555;

for(i=0;i<len;i++){
dest|=(i<(len>>1))?(src&(bit<<i))<<(31-(i<<1)):(src&(bit<<i))>>((i<<1)-31);
}
一句话搞定!
yajyjy 2005-10-17
  • 打赏
  • 举报
回复
BYTE ConvInt(BYTE iSrc)
{
BYTE iTmp = iSrc;
BYTE iDest = 0;
for (int i= 0; i<8; i++)
{
iDest <<= 1;
if (iTmp != 0)
{
iDest |= (iTmp & 0x01);
iTmp >>= 1;
}
}
return iDest;
}

把BYTE 改为int就可以,把8改为32
doway 2005-10-17
  • 打赏
  • 举报
回复
加上 sizeof 和模板,就可以放进标准库了。:)
晨星 2005-10-17
  • 打赏
  • 举报
回复
#include <iostream>
#include <bitset>
using namespace std;

unsigned int reverse_bits(unsigned int m);

int main()
{
//测试程序
int m = 1234567;
const int len = 8 * sizeof(unsigned int);
bitset<len> bs1(m);
bitset<len> bs2(reverse_bits(m));

cout << bs1 << endl;
cout << bs2 << endl;
return 0;
}

unsigned int reverse_bits(unsigned int m)
{
const int len = 8 * sizeof(m);
unsigned int mask = 1;
unsigned int retVal = 0;
for(int i = 0; i < len; i++) {
unsigned bit = m & (mask << i);
if(!bit)
continue;
int distance = len - i * 2 - 1;
if(distance >= 0) {
bit <<= distance;
} else {
bit >>= -distance;
}
retVal |= bit;
}
return retVal;
}
NetsEagle 2005-10-17
  • 打赏
  • 举报
回复
都不错
healer_kx 2005-10-17
  • 打赏
  • 举报
回复
啊,我还觉得前面的那个哥们的不错呢。
xuanwenchao 2005-10-17
  • 打赏
  • 举报
回复
楼上的算法很好啊!!!
学习了!
lazyter1 2005-10-17
  • 打赏
  • 举报
回复
多谢,多谢。今天上午去了一家比较牛的外企面试。二话没说先做N道上机题。
比较中国的软件大公司去了。先带好毕业证,是不是重点的。。。比起来。外企更注重能力。
healer_kx 2005-10-17
  • 打赏
  • 举报
回复
int main()
{
int i = 0;
unsigned int b = 1;
unsigned int q = 0xff000000;
unsigned int s = 0;
unsigned int t1 = 0;
unsigned int t2 = 0;

for (i = 0; i < 32; ++i)
{
t1 = b << (31 - i);
t2 = (t1 & q) >> (31 - i);
printf("%d ", t2);
s += (t2) << i;

}




return 0;

}
mdj_boy 2005-10-17
  • 打赏
  • 举报
回复
是这个意思吧:
比如:0x920f(1001001000001111) =〉0xf049(1111000001001001)
给个ushort的:

#include <iostream>
using namespace std;

int main()
{
unsigned short src = 0x920f; // 0x920f(1001001000001111)
unsigned short dst = 0; // 0xf049(1111000001001001)

unsigned short high = 0x8000;
unsigned short low = 0x0001;

for (int i = 15; i > 0; i -= 2)
{
dst += ( (src & high) >> i ) + ( (src & low) << i );

high = high / 2;
low = low * 2;
}

cout << showbase << hex << dst << endl;

return 0;
}
晨星 2005-10-17
  • 打赏
  • 举报
回复
哦,偶只看到1100到0011,嘿嘿,楼主也太不地道了,举个例子还举个对称的。。。
doway 2005-10-17
  • 打赏
  • 举报
回复
楼上可能误会了,说的可能是 0 和 31 位交换等等。
healer_kx 2005-10-17
  • 打赏
  • 举报
回复
大哥,你可能是理解错了。。。 。。。
晨星 2005-10-17
  • 打赏
  • 举报
回复
int i = ……;
i = ~i;
晨星 2005-10-17
  • 打赏
  • 举报
回复
使用“~”运算符啊。
csucdl 2005-10-17
  • 打赏
  • 举报
回复
学习
血洗
xiaocai0001 2005-10-17
  • 打赏
  • 举报
回复
这种题用汇编做最好使了~
doway 2005-10-17
  • 打赏
  • 举报
回复
>多谢大家。今天面试,出了这么一道上机题。一会儿给分。先吃点饭。

从时间上看,楼主的这顿饭一定吃得很过瘾。:)
nillge 2005-10-17
  • 打赏
  • 举报
回复
#include "stdlib.h"
#include "string.h"
char * rotlstr(char * str,int n)
{
int a,i;
a=strlen(str);
char temp;
while(n--)
{
temp=str[0];
for(i=0;i<=a;i++)
{
str[i]=str[i+1];
}
str[a-1]=temp;
}
return str;
}

main()
{
char str[44];
char * s;
int a;
_itoa(1100,str,10);
s=rotlstr(str,2);
a=atoi(str);

}


知道字符转的函数更加方便!!!
nillge 2005-10-17
  • 打赏
  • 举报
回复
int a=_rotr(0x1100,8);
加载更多回复(5)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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