1
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int a = 50; // 110010
    int b = 30; // 011110

    if (a & b) {
        printf("Hi");
    }
    return 0;
}

上面的代码打印 Hi。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int a = 50; // 110010
    int b = 13; // 001101

    if (a & b) {
        printf("Hi");
    }
    return 0;
}

上面的代码不打印任何东西。

从逻辑上讲,您会认为按位 AND 意味着二进制中的所有数字都必须匹配才能返回 true。相反,实际上,二进制中的每个数字都必须不同,条件才能返回 false。

我不明白按位与的意义。

我也明白 false 相当于 C 中的 0。

4

7 回答 7

2

它是按位的&。这意味着操作的结果是&对两个操作数逐位应用的结果。

int a = 50; // 110010
int b = 30; // 011110

a & b == 010010 == 18 == true

如果您希望所有位都相等,那就是==. 或者你会&用它按位111111

于 2013-08-20T01:08:00.157 回答
2

就像 Karthik 说的那样,它是按位计算的。

 int a = 50; // 110010               int a = 50; // 110010
 int b = 30; // 011110 &             int b = 13; // 001101 &
                ¯¯¯¯¯¯¯                             ¯¯¯¯¯¯¯
                010010 = 18                         000000 = 0 --false
于 2013-08-20T01:13:39.993 回答
1

运算符是按位的,这意味着它逐位比较两个变量的二进制表示。当你有

int a = 50;           // 110010
int b = 30;           // 011110
int result = a & b;   // 010010

发生的情况是: 的位是根据和result中的位值设置的。比较和中的每一对对应位。这里,由于和的第二位和第五位(从右起)均为1 ,即为真,因此这些位的比较结果为真,相应地,其中的第二位和第五位也被设置为真。因此,是非零的。这种非零评估将导致在您的第一个示例中打印。abababresultresulta & b"Hi"

在您的第二个示例中:

int a = 50;           // 110010
int b = 13;           // 001101
int result = a & b;   // 000000

在 50 和 13 的二进制表示中,没有相应的位打开:第一个位(从右边)在 50 中关闭,在 13 中打开;第二位反之亦然,依此类推。因此,对应位的比较在每种情况下都会产生 0,并且在 中没有对应的位result。因此result评估为零。这个零结果导致"Hi"在您的第二个示例中不打印。

至于这个运算符的实用性:按位运算在嵌入式系统编程中是必不可少的。它们对于某些问题也非常有效(例如,生成素数的埃拉托色尼筛型程序)。按位或在密码学中很有用。名单还在继续……

于 2013-08-20T01:36:48.013 回答
1

您不清楚的是,在 C 中,数字0是假的,而任何其他数字都是真的。

if (0) {
  printf("hi");
}

什么都不做,所以如果按位与操作没有产生一个设置位,那么你已经有效地计算了一个 if 语句,看起来像

if (false) {
  printf("hi");
}

由于其他人都做了一个很好的例子来展示位操作,我会听从他们的数学。

于 2013-08-20T03:30:48.183 回答
1

情况1:

int a = 50; // 110010
int b = 30; // 011110
if (a & b) =>if (50 & 30) => if( 1 1 0 0 1 0 &     => if(010010)=> if(18)=>
                                 0 1 1 1 1 0     )
if(18)=>if(TRUE)=> printf("Hi")

案例二:

int a = 50; // 110010
int b = 13; // 001101
if (a & b) =>if (50 & 13) => if( 1 1 0 0 1 0 &     => if(000000)=> if(0)=>
                                 0 0 1 1 0 1   )
if(0)=>if(FALSE) => NO printf("Hi")
于 2013-08-20T03:37:10.810 回答
0

这正是按位与的目的。它主要用于使用掩码进行位测试。最终效果是保留所有常见的 1 并将其他所有内容归零。比如说,你想测试第 3 位是否为 1,你可以写

if ( a & 4 /*0100*/ )
   // do something

正如 Karthik 所说,还有其他方法可以按照您预期的方式比较操作数。

于 2013-08-20T01:26:18.900 回答
0

“从逻辑上讲,您会认为按位与意味着二进制中的所有数字都必须匹配才能返回真。相反,实际上,二进制中的每个数字都必须不同,条件才能返回假。”

他们不必不同。例如,如果两个位都为零,AND 将产生零。XOR 是仅当位不同时才返回 true 的逻辑运算符,而 XNOR 是仅当它们相同时才返回 true 的逻辑运算符。由于任何非零都是真的,那么要让 AND 返回真,您只需要两个操作数中的任何一位都为 1。相反,如果两个操作数都没有共同的 1 位,它将返回 false。

于 2013-08-20T03:09:54.583 回答