按位(&)如何在Java中工作?

我正在阅读一些代码示例,并在他们的Bitwise和Bit Shift Operators页面上find了Oracle的网站。 在我看来,解释这个按比例的工作做得不太好。 我明白,它直接做了一个操作的位,但我只是不知道什么样的操作,我想知道那是什么操作。 以下是我从Oracle网站下载的示例程序: http : //docs.oracle.com/javase/tutorial/displayCode.html?code=http : //docs.oracle.com/javase/tutorial/java/nutsandbolts/实例/ BitDemo.java

一个整数表示为内存中的一系列位。 为了与人类交互,计算机必须将其显示为十进制数字,但所有计算都以二进制forms进行。 内存中的十进制数123作为1111011存储。

&运算符是一个按位“和”。 结果是两个数字都打开的位。 1001 & 1100 = 1000 ,因为只有第一位在两个打开。

| 运算符是一个按位“或”。 结果是在任何一个数字中打开的位。 1001 | 1100 = 1101 1001 | 1100 = 1101 ,因为只有右边的第二位是零。

还有^~运算符,分别是按位“Xor”和按位“Not”。 最后是<<>>>>>转换运算符。


在引擎盖下,根据系统, 123被存储为01111011 00000000 00000000 0000000000000000 00000000 00000000 01111011 。 使用按位运算符,使用哪种表示forms并不重要,因为这两种表示forms都被视为逻辑号00000000000000000000000001111011 。 剥离前导零叶1111011

这是一个二元运算符。 它执行一个AND运算,它是计算中常用于二进制数的布尔逻辑的一部分。

例如:

 0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 & 1 = 1 

您也可以在多位数字上执行此操作:

 01 & 00 = 00 11 & 00 = 00 11 & 01 = 01 1111 & 0101 = 0101 11111111 & 01101101 = 01101101 ... 

如果您查看以二进制表示的两个数字,则按位创build第三个数字,每个数字中都有一个1(其他地方都是零)。


例如
0b10011011 &
0b10100010 =
0b10000010


请注意,只有当这两个参数在那个地方有一个参数时才会出现。
当数字的每一位存储特定的一条信息时,位和和是有用的。
您也可以使用它们通过使用蒙版删除/提取某些数字部分。

如果根据hex代码展开两个variables,则这些variables是:

 bitmask : 0000 0000 0000 1111 val: 0010 0010 0010 0010 

现在,一个简单的按位“与”运算会产生数字0000 0000 0000 0010 ,十进制单位是2.我假设你知道基本的布尔运算和数字系统。

它是对input值的逻辑运算。 要理解将值转换为二进制forms,并在位置n的僵尸比特有一个1结果有一个1.最后转换回来。

例如对于这些示例值:

 0x2222 = 10001000100010 0x000F = 00000000001111 result = 00000000000010 => 0x0002 or just 2 
 import.java.io.*; import.java.util.*; public class Test { public static void main(String[] args) { int rmv,rmv1; //this RMVIVEK complete bitwise program for java Scanner vivek=new Scanner(); System.out.println("ENTER THE X value"); rmv = vivek.nextInt(); System.out.println("ENTER THE y value"); rmv1 = vivek.nextInt(); System.out.println("AND table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv&rmv1);//11=1,10=0 System.out.println("OR table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv|rmv1);//10=1,00=0 System.out.println("xOR table based\t(&)rmv=%d,vivek=%d=%d\n",rmv,rmv1,rmv^rmv1); System.out.println("LEFT SWITH based to %d>>4=%d\n",rmv<<4); System.out.println("RIGTH SWITH based to %d>>2=%d\n",rmv>>2); for(int v=1;v<=10;v++) System.out.println("LIFT SWITH based to (-NAGATIVE VALUE) -1<<%d=%p\n",i,-1<<1+i); } }