按位运算符 - 在某个位置获取单个十六进制数(0-15)

时间:2015-07-01 18:28:10

标签: bit-manipulation

假设我们有十六进制数

x = 0x345ABC678

如何才能获得给定位置的单个十六进制数字(0-15)>>仅使用按位运算符<<吗

例如,我希望从十六进制数中得到第四个数字(0xA)或第六个数字(0xC)。

总而言之,我希望通过大数据库来强制循环我将它们转换为64位数字(而不是字符串),例如单词“PUZZLER”是一个数字29996611546. A是1, Z是33.所以我想从int 29996611546获得第三个字母(存储为十进制1-33)。如果你能向我解释如何处理十六进制,我可以在我的脚本中使用它。

我是简单的PHP程序员,所以我不必长时间使用按位运算符,希望你能帮助我。

2 个答案:

答案 0 :(得分:2)

Steve Summit的解决方案/解释很明确。

或者,可以使用可变位掩码将64位数分割为16个六位数。然后可以省略前导零以仅显示有意义的数字。

#include <iostream>

int main()
{
    using namespace std;

    typedef unsigned long long u64;
    u64 number = 0x345ABC678;
    int digits[16] = {0};
    for( int i = 0; i < 16; i++ )    // fill in all 16 digits, incl. possible leading zero.
    {
        int shift_bits =  64 - 4 * ( i + 1 );
        u64 mask = 0xFULL << shift_bits;
        digits[i] = ( number & mask ) >> shift_bits;
    }

    int j = 0;
    while( !digits[j] ){ j++; }     // find the first index with non-zero digit.

    cout << hex << uppercase;
    cout << "digit #4 = " << hex << digits[ j + 3 ] << endl;
    cout << "digit #6 = " << hex << digits[ j + 5 ] << endl;
}

结果:

digit #4 = A
digit #6 = C

答案 1 :(得分:1)

你可以从像

这样的东西开始
(x >> ((8 - i) * 4)) & 0xf

这是从左到右的数字,1-8。

解释它的工作原理:考虑示例0x45ABC678。假设我们想要第3位数字。我们希望使用>>运算符将数字向右移动,然后选择最后一位数字。在这种情况下,我们希望将其向右移动5个十六进制数字(即5 * 4 = 20位),丢弃BC678并离开0x45A。然后,当我们使用0xf的按位AND选择最后一位数时,我们得到最后一位0xA

要获得第一个数字,我们必须移动7位数。要得到第三个数字,我们必须移动5位数。要获得第8位数,我们必须移动0位数。 8 - i为我们提供了这种模式。