如何获取char
类型的位数?
我从CHAR_BIT
了解climits
。这被描述为»宏产生用于表示char类型的对象的位数的最大值。«Dikumware's C Reference。我明白这意味着char
中的位数,不是吗?
我可以用std::numeric_limits
以某种方式得到相同的结果吗? std::numeric_limits<char>::digits
正确地返回7
,但不幸的是,因为此值尊重此处8位字符的签名...
答案 0 :(得分:13)
CHAR_BIT
是[signed/unsigned] char
类型的对象表示中的位数。
numeric_limits<>::digits
是给定类型的值表示中的非符号位数。
你需要哪一个?
如果要查找对象表示中的位数,那么正确的方法是采用该类型的sizeof
并将其乘以CHAR_BIT
(当然,乘法中没有意义) sizeof
在char
类型的特定情况下,由于它们的大小始终为1,因此根据定义,CHAR_BIT
alredy包含您需要的内容。
如果您正在讨论价值表示,那么numeric_limits<>
就是您的选择。
对于unsigned char
类型,对象表示的位大小(CHAR_BIT
)保证与值表示的位大小相同,因此您可以使用numeric_limits<unsigned char>::digits
和{{ 1}}可互换,但从概念的角度来看,这可能是有问题的。
答案 1 :(得分:10)
如果您想过于具体,可以这样做:
sizeof(char) * CHAR_BIT
如果你知道你肯定会使用sizeof char,那就有点矫枉过正,因为sizeof(char)保证为1。
但是如果你转移到另一种类型,例如wchar_t,这将很重要。
答案 2 :(得分:2)
查看此代码here的代码段存档,这是一个改编版本,我不会声明此代码:
int countbits(char ch){ int n = 0; if (ch){ do n++; while (0 != (ch = ch&(ch-1))); } return n; }
希望这有帮助, 最好的祝福, 汤姆。
答案 3 :(得分:1)
一种无效的方式:
char c;
int bits;
for ( c = 1, bits = 0; c; c <<= 1, bits++ )
;
printf( "bits = %d\n", bits );
答案 4 :(得分:0)
这里还没有声誉,所以我不允许回复@t0mm13b 的回答,但想指出代码有问题:
int countbits(char ch){
int n = 0;
if (ch){
do n++;
while (0 != (ch = ch&(ch-1)));
}
return n;
}
以上不会统计一个字符的位数,会统计设置的位数(1位)。
例如,以下调用将返回 4:
char c = 'U';
countbits(c);
代码:
ch = ch & (ch - 1)
是一种去除设置为 1 的最右边(最低有效)位的技巧。因此,它会掩盖设置为 0 的所有位并且不计算它们。