数组到十六进制表示

时间:2010-09-29 18:11:44

标签: c++ binary hex

我正在编写一个程序,需要取一个大小为n的数组并将其转换为十六进制值,如下所示:

int a[] = { 0, 1, 1, 0 };

我想将数组的每个值表示为二进制并将其转换为十六进制值。在这种情况下:

0x6000000000000000; // 0110...0

它也必须打包到右边,0为64位(我在64位机器上)。

或者我也可以采用数组元素,转换为十进制并转换为十六进制,这样更容易......你在C ++中做到这一点的最佳方式是什么?

(这不是作业)

5 个答案:

答案 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个条目,在编译时定义,仅包含10。在编译时定义会回避向左移动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之间的值。