我真的很困惑,但似乎不能做简单的任务:
我只需要在字节中设置位数。
例如:
我需要设置5位。所以我需要0xb00011111
。
没有循环可以做到这一点吗?
此外,我也不想写很多#defines
。
答案 0 :(得分:9)
对于小于单词中位数的任何整数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'只是被解释为十六进制数字。
答案 1 :(得分:2)
可以通过生成掩码来为任何整数类型设置最低有效5位:
mask = ~((~0u) << 5) ;
这将创建一个整数值,其中最低有效5位设置为1,所有高阶位都不管整数类型设置为0。
特别针对所讨论的8位类型:
uint8_t mask = ~((~0u) << 5) ;
解释这是如何工作的(忽略大于8位的中间整数类型):
~0u
(恭维为零)= 0x11111111
0x11100000
0x00011111
答案 2 :(得分:0)
是的,给定数字中的set
n
位可能没有循环而不是random
位,您可以设置n
consecutive
位。
用于设置single
位给定不,我们写的是
num = num | 1 << pos
;
为什么1
?因为我只想设置single
位,同样也可以设置5
位。
用于设置5位否定您可以使用以下逻辑
`num = num | 31 << pos` ;
为什么31?因为我想设置five
位(31 = 1x2 ^ 0 + 1x2 ^ 1 + ..或31是5个的总和)