- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在一个项目中有几行代码,我看不到...的值(value)
buffer[i] = (currentByte & 0x7F) | (currentByte & 0x80);
它从文件中读取文件缓冲区,以字节形式存储,然后传输到缓冲区[i],如图所示,但我不明白总体目的是什么,有什么想法吗?
谢谢
最佳答案
正如其他答案所述,(currentByte & 0x7F) | (currentByte & 0x80)
等同于 (currentByte & 0xFF)
。 JLS3 15.22.1说这被提升为 int
:
When both operands of an operator &, ^, or | are of a type that is convertible (§5.1.8) to a primitive integral type, binary numeric promotion is first performed on the operands (§5.6.2). The type of the bitwise operator expression is the promoted type of the operands.
因为 JLS3 5.6.2表示当 currentByte
的类型为 byte
并且 0x7F
是一个 int
(就是这种情况),那么两者操作数被提升为 int
。
因此,buffer
将是元素类型为 int
或更宽的数组。
现在,通过对 int
执行 & 0xFF
,我们有效地将原始 byte
范围 -128..127 映射到无符号范围0..255,例如 java.io
流经常使用的操作。
您可以在以下代码片段中看到这一点。请注意,要了解此处发生的情况,您必须知道 Java 将整数类型(char
除外)存储为 2's complement。值(value)观。
byte b = -123;
int r = b;
System.out.println(r + "= " + Integer.toBinaryString(r));
int r2 = b & 0xFF;
System.out.println(r2 + "= " + Integer.toBinaryString(r2));
最后,对于一个真实世界的例子,查看 java.io.ByteArrayInputStream
的 read
方法的 Javadoc 和实现:
/**
* Reads the next byte of data from this input stream. The value
* byte is returned as an <code>int</code> in the range
* <code>0</code> to <code>255</code>. If no byte is available
* because the end of the stream has been reached, the value
* <code>-1</code> is returned.
*/
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
关于java - Bitwise AND, Bitwise Inclusive OR 问题,在 Java 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/560956/
我是一名优秀的程序员,十分优秀!