Java 中的位 & (AND) 是如何工作的?

Posted

技术标签:

【中文标题】Java 中的位 & (AND) 是如何工作的?【英文标题】:How Does The Bitwise & (AND) Work In Java? 【发布时间】:2013-06-19 20:21:32 【问题描述】:

我正在阅读一些代码示例,并在 Oracle 网站的 Bitwise and Bit Shift Operators 页面上看到了 &。在我看来,它并没有很好地解释按位&。我知道它直接对位进行操作,但我只是不确定是什么样的操作,我想知道那个操作是什么。这是我从 Oracle 网站上下载的示例程序:http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/java/nutsandbolts/examples/BitDemo.java

【问题讨论】:

@jtahlborn 这就是我讨厌 SO 中的一些用户的原因。为什么有人不能先在***中提问?也许他们有一些先验知识,但认为 *** 是获得答案的最佳场所。 @TejaswiRana - 如果您无法在网络上自己找到简单问题的答案,那么提出这些问题并通过 SO 获得答案将弊大于利。您需要先学习如何找到简单问题的答案。有时,要真正帮助某人,您必须告诉他们真相,而不是简单的答案。 @jtahlborn 如果有人问我去火车站的哪个站台,我会给他们一个简单的答案。我不知道这是否只是我,但我也希望其他人也一样。我知道那个人在来车站之前可能已经搜索过了,但事实上我知道他们在生活中要做的不仅仅是听别人的演讲,除了简单的答案之外,我给他们任何答案都没有任何意义。 @TejaswiRana - 我理解你的观点,欢迎你在你的一生中分发鱼(一遍又一遍地给同一个人)。我更喜欢尝试教人们自己钓鱼,因为我相信从长远来看这对他们有更好的帮助。 @tjahlborn,他提出的这个问题帮助我找到了我正在寻找的答案,所以我感谢他和其他像他一样没有按照你的建议做的人。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

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


在后台,123 存储为 01111011 00000000 00000000 0000000000000000 00000000 00000000 01111011,具体取决于系统。使用位运算符,使用哪种表示并不重要,因为这两种表示都被视为逻辑数00000000000000000000000001111011。去掉前导零留下1111011

【讨论】:

"十进制的123在内存中存储为1111011" 哦,不,不完全是……不是在 Java 中。 JVM 为您掩盖了差异。但在内存中,表示取决于机器的字节顺序。它离“实现细节”非常远 它仍然与问题无关。 @EJP 不同意。在当今市场上最常用的架构中,123 在内存中不是 01111011。对此提出错误的想法至少会产生误导,在最坏的情况下是灾难的根源。 @Markus 如果没有那个字节序的废话,我会支持你的。请注意,当操作在寄存器上完成时(大部分时间),数字甚至不需要在内存中。【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

以这些示例值为例:

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

【讨论】:

【参考方案5】:

如果您查看以二进制表示的两个数字,则按位 & 会创建第三个数字,该数字在两个数字都有 1 的每个地方都有一个 1。(其他地方都是零)。


示例0b10011011 &0b10100010 =0b10000010


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

【讨论】:

【参考方案6】:
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);
    

【讨论】:

基于0和1的位运算符,AND,OR用于基于输出的真值表【参考方案7】:

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

将二进制中的任何偶数与 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);

【讨论】:

【参考方案8】:

正在逐位进行逻辑运算,因此例如 4 & 1 变成了

10 & 01 = 1x0,0x1 = 00 = 0

n & 1 用于检查偶数,因为如果一个数字是偶数,它将是 0

【讨论】:

以上是关于Java 中的位 & (AND) 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别