我正在尝试计算十六进制数中可用的位数。例如:0x00000001
应该返回8
的计数。
CString
并使用' GetLength()
'获得长度,但这似乎在这里不起作用。
编辑:抱歉,如果我忘记提到,我存储十六进制数的变量是一个无符号短数。
尝试:
unsigned short number;
CString HexValue;
HexValue.Format("%.8x",number); // number = 0000000000000000, 16 0's
HexValue = "0x" + HexValue;
int length = HexValue.GetLength() - 2; // returns an 8 here
由于每个字节包含两个十六进制数字,因此尝试使用整型变量n
sizeof(n)*CHAR_BIT/4
如果0x00000001是字符串,那么GetLength() - 2
应该给出8。如果它是存储在不同类型中的值(比如int),那么只需记住十六进制编码每8位需要2个字符来编码整个值范围(sizeof(int) * 2
)
每4位有一个十六进制数字
std::cout << sizeof(unsigned short) * CHAR_BIT / 4 << "n";
std::cout << sizeof(unsigned short) * CHAR_BIS % 4 << " LEFTOVER PARTIAL DIGITSn";
十六进制数n的位数为max(1, ceil(log2(n)))。参见维基百科,二进制对数,关于计算log2的快速算法。
这不会给你0x00000001
的值8,但是,因为实际上只需要一个数字来表示这个数字。0x00000001
和0x1
之间的差异只是显示问题。