假设我有一个类似于1010XXXX的字节,其中X值可以是任何值.我想将低4位设置为特定模式,比如1100,同时保持高4位不受影响.如何在C中以最快的速度完成这项工作?
我想在32/64位数据字段中替换位/位(大于1)而不影响其他位.例如:
我有一个64位寄存器,其中第5位和第6位可以取值0,1,2,3.
5:6
0 0
0 1
1 0
1 1
Run Code Online (Sandbox Code Playgroud)
现在,当我读取寄存器时,我得到值0x146(0001 0 10 0 0110).现在我想将第5位和第6位的值更改为01.(现在它是10,十进制是2,我想要在没有其他位受到影响的情况下将其替换为1 e 01)并仅在修改了位5和6的情况下写回寄存器(因此在更改后变为126)
我试过这样做
reg_data=0x146
reg_data |= 1 << shift (shift in this case is 5)
Run Code Online (Sandbox Code Playgroud)
如果我在位5和6处执行该值将变为11(0x3)而不是01(0x1),这是我想要的.
设置一点是可以的,但不止一点,我发现它有点困难.
任何建议都非常感谢.
如何设置(以最优雅的方式)n最不重要的位uint32_t?那就是写一个函数void setbits(uint32_t *x, int n);.函数应该处理每一个n从0到32.
尤其n==32应该处理价值.
有人可以向我解释这个功能吗?
具有最低有效n位的掩码设置为1.
例如:
n = 6 - > 0x2F,n = 17 - > 0x1FFFF //我根本得不到这些,尤其是n = 6 - > 0x2F
还有什么是面具?
我想创建一个宏或函数1 mask(n),给定一个数字n返回一个无符号整数,其n最低有效位设置.虽然这似乎应该是一个基本的原语,经过大量讨论的实现有效编译 - 似乎并非如此.
当然,各种实现对于原始整数类型可能具有不同的大小unsigned int,因此,为了具体起见,我们假设我们正在讨论uint64_t具体返回,尽管当然可接受的解决方案对于任何无符号整数类型都有效(具有不同的定义).特别是,当返回的类型等于或小于平台的原始宽度时,解决方案应该是高效的.
重要的是,这必须适用于所有人n[0,64].尤其是mask(0) == 0和mask(64) == (uint64_t)-1.许多"明显的"解决方案不适用于这两种情况之一.
最重要的标准是正确性:只有不依赖于未定义行为的正确解决方案才是有趣的.
第二个最重要的标准是性能:理想情况下,成语应该编译成大致最有效的平台特定方式,以便在通用平台上执行此操作.
在性能名称中牺牲简单性的解决方案,例如,在不同平台上使用不同的实现,是很好的.
1最常见的情况是一个函数,但理想情况下它也可以作为宏工作,而不必多次重新评估它的任何参数.