2
たとえば、次のコードは、特定のシステムで間違っているかもしれないと仮定していませんか?他のタイプのビット数を決定するための基礎としてCHAR_BITを使用できますか?
// Number of bits in an unsigned long long int:
const int ULLONG_BIT = sizeof(unsigned long long int) * CHAR_BIT;
たとえば、次のコードは、特定のシステムで間違っているかもしれないと仮定していませんか?他のタイプのビット数を決定するための基礎としてCHAR_BITを使用できますか?
// Number of bits in an unsigned long long int:
const int ULLONG_BIT = sizeof(unsigned long long int) * CHAR_BIT;
元の質問に対するPSkocikのコメントに同意します。 C11 6.2.6はCHAR_BIT * sizeof (type)
がtype
のオブジェクト表現のビット数を出力しますが、その一部はパディングビットである可能性があります。
私は「ノー仮定」のコードのための最善の策は、単に(すべて同じ値に評価すべきか~0ULL
または(unsigned long long)(-1LL)
、)ULLONG_MAX
の値をチェックすることです容疑者:
#include <limits.h>
static inline int ullong_bit(void)
{
unsigned long long m = ULLONG_MAX;
int n = 0, i = 0;
while (m) {
n += m & 1;
i ++;
m >>= 1;
}
if (n == i)
return i;
else
return i-1;
}
値のバイナリパターンがすべて1の場合、unsigned long long
が保持できるビット数は、値の2進数の数と同じです。
それ以外の場合、バイナリの最大値に0が含まれているため、最上位ビットは実際には使用できません。
理論的には、これらのビットのいくつかはパディングビットであるかもしれません。 – PSkocik
目的は何ですか?保管または計算? –
計算 - この質問を投稿するように促した問題は、パリティのためにintの1ビットを数えていました。 –