C++ 计算十六进制数中的位数

C++ 计算十六进制数中的位数,c++,visual-c++,mfc,hex,C++,Visual C++,Mfc,Hex,我试图计算十六进制数中可用的位数。例如:0x00000001应将计数返回为8 有谁能建议一下最有效的方法是什么?我尝试将其转换为CString,并使用“GetLength”获取长度,但在这里似乎不起作用 编辑:对不起,如果我忘了提到,我存储十六进制数的变量是一个无符号的短变量 我试过这个: unsigned short number; CString HexValue; HexValue.Format("%.8x",number); // number = 000000000000000

我试图计算十六进制数中可用的位数。例如: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中的位数为max1,ceillog2n。有关计算log2的快速算法,请参阅


但是,这不会给您0x00000001的值8,因为实际上只需要一个数字来表示该数字。0x00000001和0x1之间的差异只是一个显示问题。

由于每个字节包含两个十六进制数字,请尝试使用整数类型的变量nof

sizeof(n)*CHAR_BIT/4

如果0x00000001是一个字符串,那么GetLength-2应该给出8。如果它是一个存储在不同类型中的值,比如int,那么只需记住一个事实,即十六进制编码需要每8位2个字符来编码整个值范围sizeofint*2,每4位有一个十六进制数字

std::cout << sizeof(unsigned short) * CHAR_BIT / 4 << "\n";
std::cout << sizeof(unsigned short) * CHAR_BIS % 4 << " LEFTOVER PARTIAL DIGITS\n";

所有十六进制数将有8位数字。问题是什么?我正试图用它来捕获程序中的一个错误,该错误以某种方式返回超过8位数字。转换为字符串,然后获取字符串长度是最简单的解决方案,也是我所建议的。什么不适合您?@Emulator:x>255将捕捉到需要8位以上数字的情况。@Kangkan:8位、16位或64位十六进制数字如何?0x00000001是否返回8?@Nawaz:不,显然不是,我在回答中指出了这一点。将展开。@Morten:我有一个类似0x0000000000000000的错误,即16 0,我需要捕获这个错误。我试过你的技巧,但是长度部分返回一个-2。@仿真器:如果字符串前面没有0x,那么长度部分可能会返回一个不正确的值-通常不会,除非您在从int.sizeofint*CHAR\u BIT/4创建字符串时显式添加它,以覆盖每int字节和每字节字节字节。@Emulator:16个十六进制的零不是正确的值与无符号短16位相同,它是一个64位数字。16位将以十六进制编码为4个字符。因为字节不一定有8位。sizeofn*CHAR\u BIT/4是可移植的答案。@迈克·西摩:谢谢你提醒我非英特尔体系结构,更正了。