如何在Java中基于位分离十六进制字符串?
我在尝试根据给定的位数将十六进制字符串分成不同的部分时遇到了一些问题 例如,假设我有一个字符串“400a3b”,我想根据指定的位将其分解为3部分。三个部分是标记、索引和块偏移,按从左到右的顺序排列: [标签][索引][区块]如何在Java中基于位分离十六进制字符串?,java,binary,hex,Java,Binary,Hex,我在尝试根据给定的位数将十六进制字符串分成不同的部分时遇到了一些问题 例如,假设我有一个字符串“400a3b”,我想根据指定的位将其分解为3部分。三个部分是标记、索引和块偏移,按从左到右的顺序排列: [标签][索引][区块] 假设指定的索引量为3位,块偏移量为4位。如何“提取”十六进制字符串的特定部分?我计划从十六进制字符串中提取其他部分 1) 将十六进制字符串转换为长字符串 2) 通过逐位运算符“&”(逐位and)和“>>”(逐位右移)提取三部分 代码: 如何知道各种数据模式中的掩码和移位:
假设指定的索引量为3位,块偏移量为4位。如何“提取”十六进制字符串的特定部分?我计划从十六进制字符串中提取其他部分 1) 将十六进制字符串转换为长字符串 2) 通过逐位运算符“&”(逐位and)和“>>”(逐位右移)提取三部分 代码: 如何知道各种数据模式中的掩码和移位: (以下部分是凯文对我的回答的回答。) 要知道掩码和移位,让我们对数据进行位排列。 如果数据有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
这是标记的掩码,可以用十六进制表示为FFFFFFFFFFFFFF000
1的右边有12个零,因此需要右移12位
同样,索引的掩码和块的掩码是相同的
0000000000000000000000000000000000000000000000000000110000000000 // 0000000000000C00
0000000000000000000000000000000000000000000000000000001111111111 // 00000000000003FF
指数的移位是10。对于块,不需要移位
是否足够清楚?是否要从字符串“400a3b”中提取Tag=“01000000000011000”、Index=“011”和Block=“1101”?是的,这就是我目前试图做的,这与我最初做的类似,但是十六进制字符串只是一个示例。它可能是“f33500cb1”,也可能是“35d3”,因此我不确定在这些情况下如何实现掩码。如果十六进制字符串中的最大字符数小于或等于16,则将“0xFFFF80”替换为“0xFFFFFFFFFF80”就足够了。如果十六进制字符串中的最大字符数超过16,代码可能会变得非常复杂,因为java的任何数据类型都不能包含超过64位的整数。如果我不确定索引和块偏移量需要多少位,如何实现掩码?索引可以是2位,块偏移可以是10位,索引可以是10位,块偏移可以是1位,这两位可以是任意给定的数字。我无法解释如何在注释的字符限制内制作掩码,因此我将修改我的答案。
0000000000000000000000000000000000000000000000000000110000000000 // 0000000000000C00
0000000000000000000000000000000000000000000000000000001111111111 // 00000000000003FF