Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “理解”&&引用;(和)按位操作_Java_Bitwise Operators - Fatal编程技术网

Java “理解”&&引用;(和)按位操作

Java “理解”&&引用;(和)按位操作,java,bitwise-operators,Java,Bitwise Operators,我试图理解下一个算法中的逐位运算。代码本身将数字转换为十六进制表示形式 请解释一下(n&15从chars字符串中产生正确索引位置的逻辑(为什么) 对于>>操作,我的理解是将删除保留负号的最右侧数字,对吗 static String toHex(int n) { final String chars = "0123456789ABCDEF"; final StringBuilder sb = new StringBuilder(); while (n

我试图理解下一个算法中的逐位运算。代码本身将数字转换为十六进制表示形式

请解释一下(n&15从chars字符串中产生正确索引位置的逻辑(为什么)

对于>>操作,我的理解是将删除保留负号的最右侧数字,对吗

static String toHex(int n) {
    final String chars = "0123456789ABCDEF";
    final StringBuilder sb = new StringBuilder();

    while (n != 0) {
        sb.insert(0, chars.charAt(n & 15));
        n >>>= 4;
    }

    return sb.toString();
}

由于二进制中的15=1111,n&15的结果将在最后4个位置具有n位,而在其他位置具有0位。因此,这是一种更奇特的模运算方式n%16

n>>>=4将删除最后4位,将所有剩余位向右移动4处,并在前面添加4个0。所以这只是一种进行整数除法的奇特方法n/16


对于负数,它实际上不同于普通的模或除,因为&15总是给出一个正数,>=4也总是给出一个正数。

System.out.println(Integer.tobinarysting(n&15))@ElliottFrisch这不是我要问的。我不是问如何转换成十六进制。我的问题是关于“n&15”背后的逻辑。我知道已经有内置函数可以执行十六进制转换,但这不是问题。15(二进制:0000 0000 1111)是一个掩码,它将结果中的所有位从
n&15
设置为0,但较低的4位除外。结果将是一个介于0和15之间的数字,它从
chars
读取相应的字符作为索引。您询问了按位操作是如何工作的。在操作之前和之后打印值(二进制),操作应该是明显的。@API_1024在您的问题中只有两件事是重要的:
n&15
n>>=4
。您应该关注这两个操作的作用。有人已经解释得很清楚了。