按位&;(和)在Java工作?
我在阅读一些代码示例时,在Oracle网站的按位和位移位运算符页面上看到了一个按位&;(和)在Java工作?,java,bit-manipulation,bit,Java,Bit Manipulation,Bit,我在阅读一些代码示例时,在Oracle网站的按位和位移位运算符页面上看到了一个&。在我看来,解释按位&的工作做得不太好。我知道它直接对钻头进行操作,但我不确定是哪种操作,我想知道那是什么操作。这是我从Oracle网站上得到的一个示例程序:它是一个二进制AND运算符。它执行AND运算,AND运算是计算中常用于二进制数的一部分 例如: 0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 & 1 = 1 您还可以对多个位号执行此操作: 01 & 0
&
。在我看来,解释按位&
的工作做得不太好。我知道它直接对钻头进行操作,但我不确定是哪种操作,我想知道那是什么操作。这是我从Oracle网站上得到的一个示例程序:它是一个二进制AND运算符。它执行AND运算,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
...
整数表示为内存中的位序列。为了与人进行交互,计算机必须将其显示为十进制数字,但所有计算都是以二进制进行的<十进制代码>123存储在内存中为
1111011
&
运算符是按位“And”。结果是两个数字中开启的位1001&1100=1000
,因为在这两种情况下,只有第一位开启
|
运算符是按位“或”。结果是在任一数字中打开的位1001 | 1100=1101
,因为两者中只有从右开始的第二位为零
还有^
和~
运算符,它们分别是按位“异或”和按位“非”。最后还有
和>
移位运算符
在发动机罩下,
123
存储为011110000000000000000000000000000000000
或000000000000000000000000000000001111011
。使用位运算符并不重要,因为两种表示都被视为逻辑号0000000000000000000 1111011
。去掉前导零会留下1111011
如果根据十六进制代码展开这两个变量,则它们是:
bitmask : 0000 0000 0000 1111
val: 0010 0010 0010 0010
现在,一个简单的按位AND运算将产生数字
0000 0010
,其十进制单位为2。不过,我假设你知道基本的布尔运算和数字系统。这是对输入值的逻辑运算。要理解将值转换为二进制形式,以及位置n中的bot位具有1,则结果具有1。在最后,请将其转换回
例如,使用这些示例值:
0x2222 = 10001000100010
0x000F = 00000000001111
result = 00000000000010 => 0x0002 or just 2
如果您查看以二进制表示的两个数字,按位
&
将创建第三个数字,该数字的每个位置都有一个1,这两个数字都有一个1。(其他地方都有零)。示例:
0b10011011&
0b10100010=
0b10000010
请注意,只有当两个参数都有一个位于某个位置时,一个才出现在该位置。
当数字的每一位存储一条特定信息时,按位AND非常有用。
您还可以使用掩码来删除/提取数字的某些部分。
import.java.io.*;
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);
}
}
import.java.util.*;
公开课考试{
公共静态void main(字符串[]args){
int rmv,rmv1;
//这个R.M.VIVEK为java编写了完整的按位程序
Scanner vivek=新扫描仪();
System.out.println(“输入X值”);
rmv=vivek.nextInt();
System.out.println(“输入y值”);
rmv1=vivek.nextInt();
System.out.println(“和基于表的\t(&)rmv=%d,vivek=%d=%d\n”,rmv,rmv1,rmv&rmv1);//11=1,10=0
System.out.println(“或基于表的\t(&)rmv=%d,vivek=%d=%d\n”,rmv,rmv1,rmv | rmv1);//10=1,00=0
System.out.println(“基于xOR表的\t(&)rmv=%d,vivek=%d=%d\n”,rmv,rmv1,rmv^rmv1);
System.out.println(“左开关基于%d>>4=%d\n”,rmv>2);
对于(int v=1;v了解按位AND的工作原理是不够的。学习的重要部分是如何应用我们所学的内容。下面是一个应用按位AND的用例。
例如:
将二进制中的任何偶数与1的二进制相加将导致零。因为所有偶数都有它的最后一位(从左到右读取)0,而1的最后一位只有1
若你们要求写一个函数,它将一个参数作为一个数字,并在不使用加法、乘法、除法、减法、模的情况下为偶数返回true,那个么你们就不能将数字转换成字符串
此函数是使用按位AND的完美用例。正如我前面所解释的。您要求显示代码吗?这是java代码
/**
* <p> Helper function </p>
* @param number
* @return 0 for even otherwise 1
*/
private int isEven(int number){
return (number & 1);
}
/**
*辅助函数
*@param编号
*@return 0,否则返回1
*/
专用整数isEven(整数编号){
报税表(编号&1);
}
“十进制的123在内存中存储为1111011”哦,不,不完全是这样…不是在Java中。JVM为您掩盖了差异。但在内存中,表示方式取决于机器的端序。它远不是“实现细节”!这仍然与问题无关。@EJP不同意。123
在当今市场上最常用的体系结构中并不是0111011
内存中。对此给出错误的想法至少是误导性的,在最坏的情况下是灾难的根源。@Markus如果没有endianness的废话,我会投票给你的。注意t当操作在寄存器上完成时,数字甚至不需要在内存中(大多数情况下)@jtahlborn这就是我讨厌SO中一些用户的原因。为什么有人不能先问stackoverflow?也许他们有一些先验知识,但认为stackoverflow是获得答案的最佳场所。@TejaswiRana-如果你自己在网上找不到简单问题的答案,那么就先问这些问题,然后再从中得到答案粗糙的生活会带来弊大于利。你需要先学会如何找到简单问题的答案。有时候,要真正帮助别人