Java中的按位运算子字符串

时间:2011-05-29 19:28:20

标签: java substring bitwise-operators

想象一下,你有一个数字的二进制或十六进制表示。我们来看看:

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中是否有可用于数字类型的东西?

4 个答案:

答案 0 :(得分:5)

您有以位为单位指定的sizeoffset。传统上,这些位从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);
}