按位右移和0xFF | Java

3

我正在尝试理解一段代码,但无法清楚地理解其中的一些要点 这是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);
 }
< p >传递给firstMethod的值是第一次调用时的随机数,而所有后续调用方法都会传递增加1的值。

我清楚按位右移操作以及使用& 0xFF,但我仍然不太清楚以下几点:

  • 将给定值按特定数字(如16和8)移位
  • 不清楚偏移量的使用,特别是将某些数字作为偏移量传递。

有人能帮我理解这两个问题吗?


第三个方法的代码被截断了。 - Antimony
@Antimony:我也在第三个方法中添加了代码。 - Umesh Awasthi
2个回答

3

将给定的值按特定数字(如16和8,第一个为移位,第二个为不移位)进行移位。

您正在以十六进制形式打印字节。每个字节都是8位,因此您需要将每个字节向左移动。

不清楚偏移量的用法,尤其是将某些数字作为偏移量传递。

我很确定偏移量要么是a)不正确的,b)一种非常晦涩的掩码/编码数据的方式。

要将数字打印为6字节十六进制字符串,可以这样做。

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

打印
003039

这篇文章更加简短。 ;)


>>的优先级很低。这意味着

number >> 16 & 0xFF

实际上是

number >> (16 & 0xFF)

或者

number >> 16

你想表达的是:

你的意思是什么


(number >> 16) & 0xFF

或者因为结果未经过签名。
(number >>> 16) & 0xFF

谢谢您澄清事情,不过您能否提供有关偏移量的更多详细信息吗? - Umesh Awasthi
我的观点是,如果没有偏移量,它将按照十六进制打印,这是可以预料的。偏移量添加了一个简单的密码,可能是有意为之,但从代码中无法知道。 - Peter Lawrey

1

整数是32位数字。

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

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

number >> 16给出了XXXXXXXXAAAAAAAA。 number >> 16&0xFF给出了AAAAAAAA

通过第一种方法,数字分为3个字节:

AAAAAAAA和BBBBBBBB和CCCCCC(移动16,移动8和不移动) 并传递给secondMethod。

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

在thirdMethod中,4位被翻译成包含一个字符的字符串。

但是意义取决于“getAlphabet()”。 也许偏移量还有一个有用的解释。

所以您需要提供更多信息!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接