Java中的位操作主要是和

Java中的位操作主要是和,java,bitwise-operators,Java,Bitwise Operators,首先,如果这个问题最终是重复的,请道歉 我正在尝试用Java中的bits做一些事情。我需要在一个变量中得到大量的位。所以我仍然使用一个字节,但只想存储7位或4位 假设我有一个类似于'11010110'的字节,我想在末尾得到'0110'。我见过有人这样做:(byte)(b&0x0F),其中b是字节 因此,我理解这里发生的事情的方式是:b(11010110)与0x0F(0000 1111)进行and运算,然后转换为int并转换回byte 1101 0110 & 0000 1111 ---

首先,如果这个问题最终是重复的,请道歉

我正在尝试用Java中的bits做一些事情。我需要在一个变量中得到大量的位。所以我仍然使用一个字节,但只想存储7位或4位

假设我有一个类似于'11010110'的字节,我想在末尾得到'0110'。我见过有人这样做:(byte)(b&0x0F),其中b是字节

因此,我理解这里发生的事情的方式是:b(11010110)与0x0F(0000 1111)进行and运算,然后转换为int并转换回byte

1101 0110 & 
0000 1111 
---------
0010 0110 -> 0000 0000  0000 0000  0000 0000  0010 0110 -> 0010 0110
在这个例子中,我没有得到4位,我得到的是整个字节,也不是我开始使用的。我是否误解了按位and的工作原理? 我很确定这是可行的,但我不知道怎么做。 有人能解释一下吗?

我认为这样做会产生更可靠的结果: (字节)((b>4)
通过这种方式,我可以确保前4位始终为0。

您的假设是不正确的,并且提供了示例:并且始终是可靠的。之所以更频繁地使用它,是因为它更灵活。通过这种方式,您不仅可以将最高位替换为零,还可以将任何您想要的位替换为仅提供适当的掩码。还可以使用sh如果您在使用AND时需要额外注意不必要的符号位。

1101010&0000 1111=0010010 0110
-这个等式是错误的。是的,
1101010&0000 1111=0000 0110
。为什么?如果两个位都是相同的,那么不需要和=1?或者我在想别的什么?这是异或,而不是和。@Atspulgs
仅当两位在所有其他情况下均为1,0时,结果为1。