按位右移和0xFF | Java的

时间:2014-08-31 16:45:15

标签: java bit-manipulation

我正在尝试理解一段代码但却无法清楚地了解几点 这是Java代码

private String firstMethod(int number){
   return secondMethod(number >> 16 & 0xFF, 0).concat(secondMethod(number >> 8 & 0xFF, 1)).concat(secondMethod(number & 0xFF, 7));
}

private static String secondMethod(int value, int offset)
 {
     return thirdMethod(value >> 4, offset).concat(thirdMethod(value & 0xF, offset + 4));
 }

private static String thirdMethod(int value, int offset)
  {
     String chars = getAlphabet();
     int pos = (value + offset) % 16;
     return chars.substring(pos, pos + 1);
 }
传递给firstMethod

值是第一次的随机数,对方法的所有后续调用都会传递增加1的值。

我很清楚有关使用& 0xFF的按位右移操作,但是我仍然不清楚以下几点

  • 按特定数字移动给定值(首先是16和8,而不是筛选等)
  • 不清楚使用偏移量,特别是将某个数字作为偏移量。

任何人都可以帮助我理解那些2点

2 个答案:

答案 0 :(得分:3)

  

按特定数字移动给定值(首先是16和8,而不是筛选等)

您正在打印字节为hexi-decimal。每个字节都是8位,因此您希望将每个字节移位

  

不清楚使用偏移量,特别是将某个数字作为偏移量。

我很确定偏移是a)不正确,b)掩盖/编码数据的一种非常模糊的方式。

要将数字打印为6字节的hexi-decimal String,您可以执行此操作。

System.out.println(String.format("%06x", 12345));

打印

003039

这要短得多。 ;)


>>具有令人惊讶的低优先级。这意味着

number >> 16 & 0xFF

实际上是

number >> (16 & 0xFF)

number >> 16

你的内容是什么

(number >> 16) & 0xFF

或结果是无符号的。

(number >>> 16) & 0xFF

答案 1 :(得分:1)

整数是32位数。

因此,作为二进制数,您可以将数字表示为:

XXXXXXXXAAAAAAAABBBBBBBBCCCCCCCC (X,A,B,C代表0或1)。

数字>> 16给你XXXXXXXXAAAAAAAA。 数字>> 16& 0xFF为您提供AAAAAAAA

通过firstMethod编号分为3个字节:

AAAAAAAA和BBBBBBBB以及CCCCCCC(16班,8班和无班) 并给予第二种方法。

在secondMethod中,8位分为高4位和低4位。

在thirdMethod中,四个Bits转换为包含一个char的String。

但感觉取决于“getAlphabet()”。 也许对偏移量也会有一个有用的解释。

所以你必须提供进一步的信息!