我正在阅读一些代码示例,并&
在 Oracle 网站上的 Bitwise and Bit Shift Operators 页面上看到了一个。在我看来,解释 bitwise 的工作做得不太好&
。我知道它直接对位进行操作,但我只是不确定是什么样的操作,我想知道那个操作是什么。这是我从 Oracle 网站上下载的示例程序:http://docs.oracle.com/javase/tutorial/displayCode.html?code=http: //docs.oracle.com/javase/tutorial/java/nutsandbolts/示例/BitDemo.java
8 回答
整数表示为内存中的位序列。为了与人类交互,计算机必须将其显示为十进制数字,但所有计算都以二进制形式进行。123
十进制存储1111011
在内存中。
&
运算符是按位“与” 。结果是两个数字都打开的位。1001 & 1100 = 1000
,因为两者都只打开了第一位。
|
运算符是按位“或” 。结果是任一数字中打开的位。1001 | 1100 = 1101
,因为只有右数第二位在两者中都是零。
还有^
and~
运算符,分别是按位“Xor”和按位“Not”。最后是<<
,>>
和>>>
shift 运算符。
在引擎盖下,123
存储为任一01111011 00000000 00000000 00000000
或00000000 00000000 00000000 01111011
取决于系统。使用按位运算符,使用哪种表示并不重要,因为这两种表示都被视为逻辑数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
...
如果您查看以二进制表示的两个数字,则按位&
创建第三个数字,该数字在每个位置都有 1,两个数字都有 1。(其他地方都有零)。
示例:
0b10011011 &
0b10100010 =
0b10000010
请注意,只有当两个参数在那个地方都有一个时,才会出现在一个地方。
当数字的每一位存储特定信息时,按位与非常有用。
您还可以使用它们通过使用掩码删除/提取某些数字部分。
如果根据它们的十六进制代码扩展这两个变量,它们是:
bitmask : 0000 0000 0000 1111
val: 0010 0010 0010 0010
现在,一个简单的按位与运算得到数字0000 0000 0000 0010
,十进制单位为 2。不过,我假设您了解基本的布尔运算和数字系统。
它是对输入值的逻辑运算。为了理解将值转换为二进制形式以及位置 n 中的机器人位为 1,结果为 1。最后转换回来。
例如,这些示例值:
0x2222 = 10001000100010
0x000F = 00000000001111
result = 00000000000010 => 0x0002 or just 2
正在逐位进行逻辑运算,因此例如 4 & 1 变为
10 & 01 = 1x0,0x1 = 00 = 0
n & 1 用于检查偶数,因为如果一个数字是偶数,它将是 0
仅了解按位 AND 的工作原理是不够的。学习的重要部分是我们如何应用我们所学的。这是应用按位与的用例。例子:
将二进制中的任何偶数与 1 的二进制相加将导致零。因为所有偶数的最后一位(从左到右读取)都是0,而唯一的位1最后是1。
如果您要求编写一个函数,该函数将参数作为数字并在不使用加法、乘法、除法、减法、模数的情况下对偶数返回 true,并且您无法将数字转换为字符串。
此函数是使用按位与的完美用例。正如我之前解释的那样。你问给我看代码?这是java代码。
/**
* <p> Helper function </p>
* @param number
* @return 0 for even otherwise 1
*/
private int isEven(int number){
return (number & 1);
}
import.java.io.*;
import.java.util.*;
public class Test {
public static void main(String[] args) {
int rmv,rmv1;
//this R.M.VIVEK 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);
}
}