Java中的按位和(AND)如何工作?

问题描述 投票:39回答:7

我正在阅读一些代码示例,并在他们的Bitwise和Bit Shift Operators页面上遇到了Oracle网站上的&。在我看来,解释按位&的工作做得不是很好。我明白它直接对该位进行操作,但我不确定是什么样的操作,我想知道该操作是什么。这是我从Oracle网站上获得的示例程序:http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/java/nutsandbolts/examples/BitDemo.java

java bit-manipulation bit
7个回答
62
投票

整数表示为存储器中的位序列。对于与人类的交互,计算机必须将其显示为十进制数字,但所有计算都以二进制形式执行。十进制的123在内存中存储为1111011

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

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

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


在引擎盖下,123存储为01111011 00000000 00000000 0000000000000000 00000000 00000000 01111011,具体取决于系统。使用按位运算符,使用哪种表示无关紧要,因为两个表示都被视为逻辑数00000000000000000000000001111011。剥去领先的零叶1111011


9
投票

它是一个二元AND运算符。它执行AND操作,该操作是Boolean Logic的一部分,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
...

您还可以对多位数执行此操作:

&

4
投票

如果你看两个以二进制表示的数字,按位0b10011011 &会创建第三个数字,每个地方都有一个数字,两个数字都有1.(其他地方都有零)。


例: 0b10100010 = 0b10000010 bitmask : 0000 0000 0000 1111 val: 0010 0010 0010 0010


请注意,当两个参数在该位置都有一个参数时,它们才会出现在某个位置。 当数字的每个位存储特定信息时,按位和有用。 您还可以使用它们通过使用蒙版删除/提取某些数字部分。


3
投票

如果根据十六进制代码展开这两个变量,它们是:

0000 0000 0000 0010

现在,一个简单的按位AND运算产生数字0x2222 = 10001000100010 0x000F = 00000000001111 result = 00000000000010 => 0x0002 or just 2 ,它以十进制单位为2.我假设你知道基本的布尔运算和数字系统。


1
投票

它是对输入值的逻辑运算。要理解将值转换为二进制形式,并且位置n中的bot位为1,结果为1.最后转换回来。

例如,使用这些示例值:

/**
 * <p> Helper function </p>
 * @param number
 * @return 0 for even otherwise 1
 */

private int isEven(int number){
    return (number & 1);
}

0
投票

知道Bitwise AND如何工作是不够的。学习的重要部分是我们如何应用我们学到的知识。这是一个应用Bitwise AND的用例。例:

使用1的二进制文件添加二进制的任何偶数将导致零。因为所有偶数都有它的最后一位(从左到右读)0并且唯一的位1在最后是1。

如果您要求编写一个函数,该函数将参数作为数字,并且对偶数返回true而不使用加法,乘法,除法,减法,模数,并且您不能将数字转换为字符串。

此函数是使用Bitwise AND的完美用例。正如我先前所解释的那样。你问我告诉我代码?这是java代码。

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);
    }
}

-1
投票
qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.