【问题标题】:Can someone explain what the following expression does in this program?有人可以解释以下表达式在该程序中的作用吗?
【发布时间】:2021-02-09 03:54:42
【问题描述】:
String convertByteToBase4(byte x) {
    String result = “";
    for (int i=0; i<4; i++) {
        result = "0123".charAt(x & 3) + result;
        x = (byte)(x>>2)
    }
    return result;
}

我对这段代码中 &3 的用途感到困惑,是否应该将 3 的缩写添加到字节 x 中?

【问题讨论】:

标签: java syntax


【解决方案1】:

您正在转换为基数 4,这意味着每个数字两位。

3是二进制11,也就是两位。

& 3 是按位与,它有效地隔离了最右边的两位,或最右边的基数 4 位。

这与>>2相结合,将数字向右移动两位。

整个循环:获取最右边的两位,移位两位,获取接下来的两位,移位等

【讨论】:

    【解决方案2】:

    &amp;是按位与运算符,但是当按位操作数为2n - 1时,&amp; %相同,操作数加1,即这两个是一样的(对于正面x):

    x & 3 // AND with 11
    x % 4 // modulo 4
    

    在您的情况下,&amp; 3(或% 4)仅产生介于 0 和 3 之间的值(对于正值 x)。

    【讨论】:

      【解决方案3】:
      "0123".charAt(x & 3)
      

      charAt 在给定索引处返回给定字符串的字符。在本例中,字符串为"0123",索引由x &amp; 3 确定。

      3 是二进制的0000 0011。 2 位二进制数范围[0, 3]00011011

      x &amp; 3 屏蔽了x 中的高位:

        x7 x6 x5 x4 x3 x2 x1 x0
      &  0  0  0  0  0  0  1  1
      -------------------------
                          x1 x0
      

      所以您可以简单地将x &amp; 3 视为x % 4。而且,毫无疑问,按位运算比算术运算快得多。

      【讨论】:

        猜你喜欢
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-14
        相关资源
        最近更新 更多