求更好的位反转算法

未知电子 2015-02-09 12:07:13
题目如下:
在一个多任务嵌入式系统中,有一个CPU可直接寻址的32位寄存器REGn,地址为
0x1F000010,编写一个安全的函数,将寄存器REGn的指定位反转(要求保持其他bit的值不变)。


我写的如下:
#define FALSE 0
#define TRUE 1
#define REGn_DATA (*(unsigned int*)(0x1F000010))
unsigned int InversionREGn(unsigned int bit)
{
unsigned int data=0;
if(bit>31)
{
return FALSE;
}
data = (REGn_DATA>>bit)&1;
if(data)
{
REGn_DATA &= ~(1<<bit);
}
else
{
REGn_DATA |= (1<<bit);

}
return TRUE;
}




想问一下大家有什么更快的方法!
...全文
625 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathletboy 2015-03-04
  • 打赏
  • 举报
回复
要反转的位xor bit 1就可以,所以2楼是正解。
第五维度 2015-03-04
  • 打赏
  • 举报
回复
唉,奶奶的,我自己的回帖咋不能编辑哪!
第五维度 2015-03-04
  • 打赏
  • 举报
回复
写错了,2楼正解
falloutmx 2015-03-04
  • 打赏
  • 举报
回复
引用 5 楼 zilong91 的回复:
2楼误导了 加入要对BIT[3]取反,执行异或操作的结果是 1110 ^ 1000 = 1110 并没有得到想要的结果0110 SO,1楼正确。
1 xor 1 = 0?
第五维度 2015-03-04
  • 打赏
  • 举报
回复
2楼误导了 加入要对BIT[3]取反,执行异或操作的结果是 1110 ^ 1000 = 1110 并没有得到想要的结果0110 SO,1楼正确。
worldy 2015-02-09
  • 打赏
  • 举报
回复
最简单最高效的: n=(1<<bit); regn ^=n;
worldy 2015-02-09
  • 打赏
  • 举报
回复
n=(1<<bit); if(regn & n) regn &=(~n); else regn |=n;
猪头三小队长 2015-02-09
  • 打赏
  • 举报
回复
这个问题是架构相关的,要看cpu能够提供什么样的指令,如果有位翻转指令当然那个最快,没有的话再看是否提供异或什么的,都没有的话另说了。 c语言级别和最终的汇编代码,在不同架构下差异很大,不能一概而论,所以很多算法级的优化要求的是要懂汇编。
of123 2015-02-09
  • 打赏
  • 举报
回复
二楼正解。该位异或比特 1 即可。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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