假设我们有十六进制数
x = 0x345ABC678
如何才能获得给定位置的单个十六进制数字(0-15)>>仅使用按位运算符<<吗
例如,我希望从十六进制数中得到第四个数字(0xA
)或第六个数字(0xC
)。
总而言之,我希望通过大数据库来强制循环我将它们转换为64位数字(而不是字符串),例如单词“PUZZLER”是一个数字29996611546. A是1, Z是33.所以我想从int 29996611546获得第三个字母(存储为十进制1-33)。如果你能向我解释如何处理十六进制,我可以在我的脚本中使用它。
我是简单的PHP程序员,所以我不必长时间使用按位运算符,希望你能帮助我。
答案 0 :(得分:2)
或者,可以使用可变位掩码将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
为我们提供了这种模式。