【问题标题】:bitwise right shift and 0xFF | Java按位右移和 0xFF |爪哇
【发布时间】:2014-08-31 16:45:14
【问题描述】:

我正在尝试理解一段代码,但无法清楚地了解几点 这是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 表示第一次而不是没有筛选等)
  • 不清楚偏移量的使用,特别是传递某个数字作为偏移量。

谁能帮我理解这两点

【问题讨论】:

  • 第三种方法的代码被截断
  • @Antimony:我也向第三种方法添加了代码

标签: java bit-manipulation


【解决方案1】:

按特定数字移动给定值(例如 16 和 8 表示第一次而不是没有筛选等)

您正在将字节打印为十六进制。每个字节为 8 位,因此您希望将每个字节移动

不清楚offset的使用,具体是传递某个数字作为offset。

我很确定偏移量是 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

【讨论】:

  • 感谢您的澄清,但是您能否提供更多关于您的抵消点的详细信息?
  • 我关于偏移量的观点是,如果它不存在,它将以十六进制打印 - 正如您所期望的那样十进制。偏移量添加了一个简单的密码,这可能是有意的,但无法通过阅读代码来知道。
【解决方案2】:

整数是 32 位数字。

所以作为一个二进制数,你可以将数字表示为:

XXXXXXXXXAAAAAAAAABBBBBBBBCCCCCCCC (X、A、B、C 代表 0 或 1)。

number >> 16 给你 XXXXXXXXXAAAAAAAAA。 number >> 16 & 0xFF 给你 AAAAAAAAA

通过第一个方法号被分成3个字节:

AAAAAAA 和 BBBBBBBB 和 CCCCCCC(16 档,8 档,无档) 并赋予第二个方法。

在第二种方法中,8位被分为高四位和低四位。

在第三个方法中,四个位被转换为一个包含一个字符的字符串。

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

所以你必须提供更多信息!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    相关资源
    最近更新 更多