我在尝试根据给定的位数将十六进制字符串分成不同的部分时遇到了一些麻烦。
例如,假设我有一个字符串“400a3b”,我想根据指定的位将其分解为3个部分。这三个部分是从左到右依次的标签,索引和块偏移:
[TAG] [INDEX] [BLOCK]
假设指定的索引量是3位,块偏移是4位。我怎样才能“提取”十六进制字符串的那些特定部分?
答案 0 :(得分:0)
我计划从十六进制字符串中提取零件。
1)将十六进制字符串转换为Long。
2)通过逐位运算符提取三个部分,“&” (按位和)和“>>” (按位向右移动)。
代码:
char* hexStr;
Long original, tag, index,block;
hexStr = "400a3b"; /* This is hex string to be processed */
original = Long.parseLong(hexStr, 16); /* Long converted from hex string */
tag = (original & 0xFFFF80) >> 7; /* mask higher 17 bits , then shift right 7 bits for TAG */
index = (original & 0x000070) >>4; /* mask 18 to 20 bits , then shift right 4 bit for INDEX */
block = original & 0x00000F; /* mask 21-24 bits for BLOCK */
如何知道面具并转换各种数据模式:
(以下部分是凯文回答我的答案的答案。)
要知道掩码和移位,请对数据进行位排列。 如果数据具有2位索引和10位块,则其余52位为标记。
我使用't'表示用于标记的位,'i'表示索引,'b'表示块。
在2比特索引和10比特块情况下,数据的比特排列如下
ttttttttttttttttttttttttttttttttttttttttttttttttttttiibbbbbbbbbb // 52 't's, 2 'i's and 10 'b's.
要获取标签的掩码,请将't'替换为1,将'i'替换为0,将'b'替换为0。
1111111111111111111111111111111111111111111111111111000000000000
这是标记的掩码,它可以用十六进制表示为FFFFFFFFFFFFF000。
右边有12个零,所以右移12位是必要的。
同样,索引和块的掩码是
0000000000000000000000000000000000000000000000000000110000000000 // 0000000000000C00
0000000000000000000000000000000000000000000000000000001111111111 // 00000000000003FF
并且索引的移位是10.对于块,没有必要移位。
是否足够清楚?