【问题标题】:Array to Hex Representation数组到十六进制表示
【发布时间】:2011-04-18 23:35:20
【问题描述】:

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

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

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

0x6000000000000000; // 0110...0

它还必须在右边用 0 打包为 64 位(我在 64 位机器上)。

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

(这不是家庭作业)

【问题讨论】:

    标签: c++ binary hex


    【解决方案1】:

    以下假设您的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 )

    【讨论】:

    • 需要从 63 中减去...移位 64 是实现定义的。
    • 谢谢,这很好用。我必须将结果类型设为 unsigned long long 并将 a[c] 转换为 unsigned long long。谢谢!
    【解决方案2】:

    std::bitset&lt;64&gt;::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;
    

    【讨论】:

    • 我认为他正在尝试从 int 的数组中生成 unsigned long 。他没有一个可以传递给bitset(我已经放弃了这个想法,但也许我读错了问题)。
    • @Mark:是的,我编辑了答案以扭转这种感觉。 bitset 双向工作。
    • +1 但我想知道,std::copy 是否与 bitset 一起使用?
    【解决方案3】:
    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 的问题,因为你不能声明一个空数组。

    【讨论】:

    • 它可以有超过64个条目,但我喜欢这个
    • @gprime,如果条目超过 64 个,预期的行为是什么?
    • 永远不会超过 64...如果我愿意,我将不得不使用不同的数据结构。但是我在我的程序中进行了编码,如果超过 64,则不尝试执行计算。
    【解决方案4】:

    这是一个粗略的答案:

    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;
    }
    

    【讨论】:

    • 这是一个我们没有足够的原始问题信息来实现的功能。实现(或更可能是合适的替代)留给实现者作为练习。
    【解决方案5】:

    字节十六进制值[16];

    for(int i = 15; i >= 0; i--) { hexValues = a[i*4] * 8 + a[i*4-1] * 4 + [i*4-2] * 2 + a[i*4-3]; }

    这将为您提供一个字节数组,其中每个字节代表一个十六进制值。

    请注意,hexValues 中的每个字节都是从 0 到 16 的值。

    【讨论】:

      猜你喜欢
      • 2018-05-17
      • 2012-04-16
      • 2016-02-06
      • 2021-09-08
      • 1970-01-01
      • 2012-04-22
      • 2012-05-09
      • 1970-01-01
      • 2011-12-09
      相关资源
      最近更新 更多