共2条
1/1 1 跳转至页
青岛朗讯的一道题,可惜我没有去
问
大意是说将一个整数反置,如二进制是01010000 ,结果为00001010
我想可以这样
unsigned int getit(unsigned int v)
{
unsigned int result = 0,t = ((unsigned int)(~0)>>1)+1;
while(v!=0)
{
if(v&1!=0)
{
result|=t;
}
t>>=1;
v>>=1;
}
return( result);
}
不知道大家有什么好的实现,
答 1: 如果用汇编除移动数据外,只需要一条指令。
答 2: 对啊,为什么不用汇编呢 答 3: 呵呵传说中的CPL语句?:) 答 4: 看看这样行吗?unsigned char getit(unsigned char v)
{
unsigned char result = 0,i;
for(i=0;i<8;i++)
{
result<<=1;
result+=v%2;
v>>=1;
}
return( result);
}
答 5: 可以阿 误会了,我举例是8位,可是整数不一定是8位阿
awey 写的有个好处是不需要判断语句,但出现了MOD运算,这样效率可能依赖
不同的编译器。
答 6: 不用判断语句,大概可以这样吧unsigned int getit(unsigned int v)
{
unsigned int result = 0,t = (unsigned int)(~0);
while(v!=0)
{
t>>=1;
result|= v&1 + t;
v>>=1;
}
result &=~t;
return( result);
}
答 7: 不错 答 8: 模2运算在编译器里好像就是移位运算 答 9: 厉害 答 10: 右移出,左移入 答 11: 其实用判断语句效率不见得低既不能固定位数,又不用判断语句,大概只能这样了(不如判断语句清楚):
unsigned int InvertBitOrder(unsigned int v)
{
static const unsigned int mask[] = { 0u, ~0u };
unsigned int result = 0u;
unsigned int bit = ((~0u)>>1)+1;
while(v != 0)
{
result |= ( bit & mask[v & 0x01] );
bit >>= 1;
v >>= 1;
}
}
答 12: 去MCU厂家定做一条这样反转的指令,呵呵~~~~~~~~~~
我想可以这样
unsigned int getit(unsigned int v)
{
unsigned int result = 0,t = ((unsigned int)(~0)>>1)+1;
while(v!=0)
{
if(v&1!=0)
{
result|=t;
}
t>>=1;
v>>=1;
}
return( result);
}
不知道大家有什么好的实现,
答 1: 如果用汇编除移动数据外,只需要一条指令。
答 2: 对啊,为什么不用汇编呢 答 3: 呵呵传说中的CPL语句?:) 答 4: 看看这样行吗?unsigned char getit(unsigned char v)
{
unsigned char result = 0,i;
for(i=0;i<8;i++)
{
result<<=1;
result+=v%2;
v>>=1;
}
return( result);
}
答 5: 可以阿 误会了,我举例是8位,可是整数不一定是8位阿
awey 写的有个好处是不需要判断语句,但出现了MOD运算,这样效率可能依赖
不同的编译器。
答 6: 不用判断语句,大概可以这样吧unsigned int getit(unsigned int v)
{
unsigned int result = 0,t = (unsigned int)(~0);
while(v!=0)
{
t>>=1;
result|= v&1 + t;
v>>=1;
}
result &=~t;
return( result);
}
答 7: 不错 答 8: 模2运算在编译器里好像就是移位运算 答 9: 厉害 答 10: 右移出,左移入 答 11: 其实用判断语句效率不见得低既不能固定位数,又不用判断语句,大概只能这样了(不如判断语句清楚):
unsigned int InvertBitOrder(unsigned int v)
{
static const unsigned int mask[] = { 0u, ~0u };
unsigned int result = 0u;
unsigned int bit = ((~0u)>>1)+1;
while(v != 0)
{
result |= ( bit & mask[v & 0x01] );
bit >>= 1;
v >>= 1;
}
}
答 12: 去MCU厂家定做一条这样反转的指令,呵呵~~~~~~~~~~
共2条
1/1 1 跳转至页
回复
| 有奖活动 | |
|---|---|
| 2026年“我要开发板活动”第三季,开始了! | |
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
我要赚赏金打赏帖 |
|
|---|---|
| window下生成compilecommands.json的的方法被打赏¥22元 | |
| 【S32K3XX】GPIO中断配置被打赏¥26元 | |
| 【分享开发笔记,赚取电动螺丝刀】WS2812B的RGB灯介绍以及驱动方法被打赏¥25元 | |
| PTC与NTC功能常规对比被打赏¥14元 | |
| 【S32K3XX】核间通信MU使用被打赏¥27元 | |
| 【分享开发笔记,赚取电动螺丝刀】关于3pin锂电池接口的介绍/使用被打赏¥16元 | |
| 以启明云端ESP32P4开发板实现TF卡读写功能被打赏¥28元 | |
| 【分享开发笔记,赚取电动螺丝刀】树莓派5串口UART0配置被打赏¥25元 | |
| 【STM32F103ZET6】17:分享在Rtos项目中断管理的使用经验被打赏¥23元 | |
| 【STM32F103ZET6】16:分享在中断中恢复串口任务,遇到的问题被打赏¥31元 | |
我要赚赏金
