我真的很困惑,似乎无法完成简单的任务:
我只需要在字节中设置比特数。
例如:
我需要设置5位。所以我需要0xb00011111
。
是否有可能不使用循环来完成这个任务?
另外,我也不想写太多的#defines
。
我真的很困惑,似乎无法完成简单的任务:
我只需要在字节中设置比特数。
例如:
我需要设置5位。所以我需要0xb00011111
。
是否有可能不使用循环来完成这个任务?
另外,我也不想写太多的#defines
。
对于任何比字长小的整数n
,您需要的掩码是:
const unsigned int mask = (1u << n) - 1;
无需使用循环。
一个简单的函数可使用此方式:
unsigned int set_lsbs(unsigned int n)
{
return (1u << n) - 1;
}
0: 0x0
1: 0x1
2: 0x3
3: 0x7
4: 0xf
5: 0x1f
6: 0x3f
7: 0x7f
8: 0xff
9: 0x1ff
0xb00011111
不是二进制字面量,其中的“b”只是被解释为十六进制数字。mask = ~((~0u) << 5) ;
这将创建一个整数值,其中最低有效的5位设置为1,所有高阶位无论整数类型如何都设置为0。
具体来说,针对所讨论的8位类型:
uint8_t mask = ~((~0u) << 5) ;
~0u
(零的补码)= 0x11111111
0x11100000
0x00011111
num = num | 1 << pos ;
如果要设置给定数字中的5
个连续位,可以使用以下逻辑
num = num | 31 << pos;
这里
31 ==> 1x2^0 + 1x2^1 + .. => 31 is the sum of 5 ones(1 1111)
case
呢?不,只有两个按位操作就可以使代码相同,快速且容易。 - Bulkindouble pow(float, int);
返回双精度浮点数。你有没有看过你之前的答案?这是非常糟糕的例子和非常糟糕的建议。最好删除它。 - Bulkin
0xb00011111
是有效的C代码,但它并不像原帖作者所期望的那样。 - phuclv0xb00011111
是有效的 C 代码,但是一个非常大的十六进制字面量 :) 作者本意是0b00011111
,但这在 C 中不是有效的,因为 C 不支持二进制字面量。 - Lundin