繁体   English   中英

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

[英]How Does The Bitwise & (AND) Work In Java?

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

整数表示为存储器中的位序列。 为了与人互动,计算机必须将其显示为十进制数字,但所有计算均以二进制形式进行。 十进制123会作为1111011存储在内存中。

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

| 运算符是按位“或”。 结果是两个数字中的任何一个都打开的位。 1001 | 1100 = 1101 1001 | 1100 = 1101 ,因为两者中仅右起的第二位为零。

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


00000000 00000000 00000000 01111011根据系统的不同, 123可以存储为01111011 00000000 00000000 0000000000000000 00000000 00000000 01111011 使用按位运算符,使用哪种表示形式都没有关系,因为这两种表示形式都被视为逻辑数00000000000000000000000001111011 去除前导零将留下1111011

这是一个二进制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
...

如果查看以二进制表示的两个数字,则按位&创建第三个数字,该数字在每个位置都为1,而两个数字都为1。(在其他任何地方都为零)。


范例
0b10011011 &
0b10100010 =
0b10000010


请注意,只有当两个参数在该位置都具有一个时,该位置才会出现。
当数字的每一位存储特定信息时,按位与是有用的。
您也可以使用掩码来使用它们删除/提取数字的某些部分。

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

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

现在,一个简单的按位与运算将得出数字0000 0000 0000 0010 ,其十进制单位为2。不过,我假设您了解基本的布尔运算和数字系统。

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

例如,使用以下示例值:

0x2222 =  10001000100010
0x000F =  00000000001111
result =  00000000000010   => 0x0002 or just 2

仅仅了解按位AND的工作原理还不够。 学习的重要部分是我们如何运用所学知识。 这是一个应用按位与的用例。 例:

在二进制中将任何偶数与1的二进制相加将得出零。 因为所有偶数的最后一位(从左至右读取)为0,而最后一位只有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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM