如何获得类型的位数char
?
我知道CHAR_BIT
从climits
. 这被描述为 »宏产生用于表示 char 类型对象的位数的最大值。« 在Dikumware 的 C 参考。我知道这意味着 a 中的位数char
,不是吗?
我能以std::numeric_limits
某种方式得到相同的结果吗?std::numeric_limits<char>::digits
正确返回7
但不幸的是,因为此值尊重此处 8 位字符的符号性……</p>
如何获得类型的位数char
?
我知道CHAR_BIT
从climits
. 这被描述为 »宏产生用于表示 char 类型对象的位数的最大值。« 在Dikumware 的 C 参考。我知道这意味着 a 中的位数char
,不是吗?
我能以std::numeric_limits
某种方式得到相同的结果吗?std::numeric_limits<char>::digits
正确返回7
但不幸的是,因为此值尊重此处 8 位字符的符号性……</p>
CHAR_BIT
根据定义,是类型的对象表示中的位数[signed/unsigned] char
。
numeric_limits<>::digits
是给定类型的值表示中的非符号位数。
你需要哪一个?
如果您正在寻找对象表示中的位数,那么正确的方法是采用sizeof
类型并将其乘以(当然,在特定类型的情况下CHAR_BIT
乘以是没有意义的,因为它们的大小始终为 1 ,并且因为根据定义已经包含您需要的内容)。sizeof
char
CHAR_BIT
如果您在谈论价值表示,那么numeric_limits<>
就是要走的路。
对于unsigned char
类型,对象表示 ( CHAR_BIT
) 的位大小保证与值表示的位大小相同,因此您可以使用numeric_limits<unsigned char>::digits
和CHAR_BIT
互换,但从概念的角度来看,这可能是有问题的。
如果你想过于具体,你可以这样做:
sizeof(char) * CHAR_BIT
如果你知道你肯定会做 sizeof char,这有点矫枉过正,因为 sizeof(char) 保证为 1。
但是,如果您改用其他类型,例如 wchar_t,那将很重要。
在此处查看此代码的片段存档,这是一个改编版本,我不主张此代码:
int countbits(char ch){ 诠释 n = 0; 如果 (ch){ 做n++; 而 (0 != (ch = ch&(ch-1))); } 返回 n; }
希望这会有所帮助,最好的问候,汤姆。
一种低效的方式:
char c;
int bits;
for ( c = 1, bits = 0; c; c <<= 1, bits++ )
;
printf( "bits = %d\n", bits );
这里还没有声誉,所以我不允许回复 @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 的位并且不计算它们。