按位&;(和)在Java工作?

按位&;(和)在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网站的按位和位移位运算符页面上看到了一个
&
。在我看来,解释按位
&
的工作做得不太好。我知道它直接对钻头进行操作,但我不确定是哪种操作,我想知道那是什么操作。这是我从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-如果你自己在网上找不到简单问题的答案,那么就先问这些问题,然后再从中得到答案粗糙的生活会带来弊大于利。你需要先学会如何找到简单问题的答案。有时候,要真正帮助别人