Java “理解”&&引用;(和)按位操作
我试图理解下一个算法中的逐位运算。代码本身将数字转换为十六进制表示形式 请解释一下(n&15从chars字符串中产生正确索引位置的逻辑(为什么) 对于>>操作,我的理解是将删除保留负号的最右侧数字,对吗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
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
。您应该关注这两个操作的作用。有人已经解释得很清楚了。