我正在编写一个程序,需要取一个大小为n的数组并将其转换为十六进制值,如下所示:
int a[] = { 0, 1, 1, 0 };
我想将数组的每个值表示为二进制并将其转换为十六进制值。在这种情况下:
0x6000000000000000; // 0110...0
它也必须打包到右边,0为64位(我在64位机器上)。
或者我也可以采用数组元素,转换为十进制并转换为十六进制,这样更容易......你在C ++中做到这一点的最佳方式是什么?
(这不是作业)
答案 0 :(得分:4)
以下假设您的a[]
将仅使用0和1来表示位。您还需要指定数组长度,在这种情况下可以使用sizeof(a)/sizeof(int)
,但不能用于堆分配的数组。此外,result
需要是64位整数类型。
for (int c=0; c<array_len; c++)
result |= a[c] << (63-c);
如果您想查看十六进制的样子,可以使用(s)printf( "%I64x", result )
答案 1 :(得分:1)
std::bitset<64>::to_ulong()
可能是你的朋友。顺序可能是向后的(它是未指定的,但通常通过将单词右移3并用1屏蔽来获取索引3),但是你可以通过从63中减去所需的索引来解决这个问题。
#include <bitset>
std::bitset<64> bits;
for ( int index = 0; index < sizeof a/sizeof *a, ++ index ) {
bits[ 63 - index ] = a[ index ];
}
std::cout << std::hex << std::setw(64) << std::setfill('0')
<< bits.to_ulong() << std::endl;
答案 2 :(得分:1)
unsigned long long answer= 0;
for (int i= 0; i<sizeof(a)/sizeof(a[0]); ++i)
{
answer= (answer << 1) | a[i];
}
answer<<= (64 - sizeof(a)/sizeof(a[0]));
假设:a[]
最多64个条目,在编译时定义,仅包含1
或0
。在编译时定义会回避向左移动64的问题,因为你不能声明一个空数组。
答案 3 :(得分:0)
这是一个粗略的答案:
int ConvertBitArrayToInt64(int a[])
{
int answer = 0;
for(int i=0; i<64; ++i)
{
if (isValidIndex(i))
{
answer = answer << 1 | a[i];
}
else
{
answer = answer << 1;
}
}
return answer;
}
答案 4 :(得分:0)
byte hexValues [16];
for(int i = 15; i&gt; = 0; i--) { hexValues = a [i * 4] * 8 + a [i * 4-1] * 4 + [i * 4-2] * 2 + a [i * 4-3]; }
这将为您提供一个字节数组,其中每个字节代表一个十六进制值。
请注意,hexValues中的每个字节都是0到16之间的值。