想象一下,你有一个数字的二进制或十六进制表示。我们来看看:
int number = 0xffffff;
// this would recover the third f, as a stand-alone value, value of third_f would be just f
int third_f = byteSubstring(number,2,1);
// third and fourth f, value of tf would be ff
int tf = byteSubstring(number,2,2);
// all except first, value of except_first would be fffff
int except_first = byteSubstring(number,1,5);
使用单独的按位操作,笔和&论文,我知道如何提取所有这些,但将它们组合在一个通用函数中...... :)。 JDK中是否有可用于数字类型的东西?
答案 0 :(得分:5)
您有以位为单位指定的size
和offset
。传统上,这些位从LSB开始编号。
您通过向右移动来处理offset
result = x >>> offset
你通过掩蔽来处理大小; (1 << size) - 1
是面具
result = result & ((1 << size) - 1)
答案 1 :(得分:3)
Java通常使用bitwise operators,因此您只需构建一个掩码并and
数据。
修改强>
也许一些示例代码会更有用:
// be aware - this actually substrings a hex substring, using
// bit ops
int byteSubString(int number,
int firstPos /* 0-indexed */,
int length) {
// tricky naming as hex = 2 byte per char!
int mask = 0;
switch (length) { //lookup table/array might be best here
case 0: mask = 0; break;
case 1: mask = 0xf; break;
case 2: mask = 0xff; break;
case 3: mask = 0xfff; break;
case 4: mask = 0xffff; break;
case 5: mask = 0xfffff; break;
default: throw new IllegalArgumentException(
"Length of " + length + " not supported");
}
int tmp = (number >> (4*firstPos));
tmp = (tmp & mask);
System.out.println("Byte substring on " +
Integer.toHexString(number) +
" starting at pos " + firstPos +
" with length " + length +
" uses mask " + Integer.toHexString(mask) +
" results in " + Integer.toHexString(tmp));
return tmp;
}
当然你也可以将String渲染为十六进制表示并将其子串。可能更快,更可读:)
答案 2 :(得分:2)
请参阅Formatter中的“格式”语法并与String.format("%x", hexa)
结合使用。例如,String.format("%x", 0xffffff)
会返回String
“ffffff”。然后你可以把你想要的方法写成这个和String.substring
的包装器。
然而,它无法处理二进制文件,但手动编码更容易。
编辑:实际上Integer.toBinaryString
也存在。
答案 3 :(得分:1)
我不知道标准库中的任何功能。
相似的东西都在Integer
类中,有些函数可以对位进行一些组合操作。
您可以自行编码:
// offset and len are bits
// (so you multiply them by 4 if you want to get a hex representation)
int substring(int value, int offset, int len) {
value >>>= (Integer.SIZE - Integer.numberofLeadingZeros(value)) - (offset + len);
return value & ((1 << len) - 1);
}