按位和行为是否与预期不同? #包括 #包括 int main(int argc,char*argv[]){ int a=50;//110010 int b=30;//011110 国际单项体育联合会(a&b){ printf(“Hi”); } 返回0; }

按位和行为是否与预期不同? #包括 #包括 int main(int argc,char*argv[]){ int a=50;//110010 int b=30;//011110 国际单项体育联合会(a&b){ printf(“Hi”); } 返回0; },c,bit-manipulation,C,Bit Manipulation,上面的代码打印Hi #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; } #包括 #包括 int main(int argc,char*arg

上面的代码打印Hi

#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;
}
#包括
#包括
int main(int argc,char*argv[]){
int a=50;//110010
int b=13;//001101
国际单项体育联合会(a&b){
printf(“Hi”);
}
返回0;
}
上面的代码不打印任何内容


从逻辑上讲,您可能认为按位AND表示二进制中的所有数字必须匹配才能返回true。相反,在现实中,二进制中的每个数字都必须不同,才能使条件返回false

我不明白按位和的意思


我也知道false在C中等于0。

它是一个按位的
&
。这意味着运算的结果是在两个操作数上逐位应用
&
的结果

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

如果您希望所有位都相等,那只是
==
。或者您可以使用
111111
按位
&
它是一个按位
&
。这意味着运算的结果是在两个操作数上逐位应用
&
的结果

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

如果您希望所有位都相等,那只是
==
。或者你可以用
111111
按位
&
它,就像Karthik说的那样

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

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

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

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

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

这正是按位and的目的。它主要用于带掩码的位测试。其净效果是保留所有常用的1,并将其他所有值置零。比如说,如果你想测试第三位是否为1,你可以直接写

 int a = 50; // 110010               int a = 50; // 110010
 int b = 30; // 011110 &             int b = 13; // 001101 &
                ¯¯¯¯¯¯¯                             ¯¯¯¯¯¯¯
                010010 = 18                         000000 = 0 --false

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

这正是按位and的目的。它主要用于带掩码的位测试。其净效果是保留所有常用的1,并将其他所有值置零。比如说,如果你想测试第三位是否为1,你可以直接写

 int a = 50; // 110010               int a = 50; // 110010
 int b = 30; // 011110 &             int b = 13; // 001101 &
                ¯¯¯¯¯¯¯                             ¯¯¯¯¯¯¯
                010010 = 18                         000000 = 0 --false

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

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

if ( a & 4 /*0100*/ )
   // do something
发生的情况是:
result
的位基于
a
b
中的位值进行设置。比较
a
b
中的每对对应位。这里,由于
a
b
的第二位和第五位(从右起)都是1,即真,这些位的比较产生真,相应地,
结果中的第二位和第五位也设置为真。因此,
结果
为非零。对
a&b
的非零评估将导致在第一个示例中打印
“Hi”

在第二个示例中:

int a = 50;           // 110010
int b = 30;           // 011110
int result = a & b;   // 010010
在50和13的二进制表示中,没有对应位处于打开状态的情况:第一位(从右侧开始)在50中处于关闭状态,在13中处于打开状态;对于第二位,反之亦然,依此类推。因此,在每种情况下,对应位的比较都会产生0,并且在
结果中没有对应位处于打开状态。因此,
结果
的计算结果为零。此零结果导致第二个示例中的
“Hi”
不打印


关于这个操作符的实用性:位操作在嵌入式系统编程中是必不可少的。对于某些问题(例如,用于生成素数的Eratosthenes筛型程序),它们也非常有效。按位or在密码学中很有用。名单还在继续

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

if ( a & 4 /*0100*/ )
   // do something
发生的情况是:
result
的位基于
a
b
中的位值进行设置。比较
a
b
中的每对对应位。这里,由于
a
b
的第二位和第五位(从右起)都是1,即真,这些位的比较产生真,相应地,
结果中的第二位和第五位也设置为真。因此,
结果
为非零。对
a&b
的非零评估将导致在第一个示例中打印
“Hi”

在第二个示例中:

int a = 50;           // 110010
int b = 30;           // 011110
int result = a & b;   // 010010
在50和13的二进制表示中,没有对应位处于打开状态的情况:第一位(从右侧开始)在50中处于关闭状态,在13中处于打开状态;对于第二位,反之亦然,依此类推。因此,在每种情况下,对应位的比较都会产生0,并且在
结果中没有对应位处于打开状态。因此,
结果
的计算结果为零。此零结果导致第二个示例中的
“Hi”
不打印

关于这个操作符的实用性:位操作在嵌入式系统编程中是必不可少的。对于某些问题(例如,用于生成素数的Eratosthenes筛型程序),它们也非常有效。按位or在密码学中很有用。名单还在继续

“从逻辑上讲,您可能认为按位AND表示二进制中的所有数字都必须匹配才能返回true。实际上,二进制中的每个数字都必须不同,才能使条件返回false。”

他们不必与众不同。例如,如果两个位都为零,则会产生零。XOR是仅当位不同时才返回true的逻辑运算符,XNOR是仅当位相同时才返回true的逻辑运算符。因为任何非零的值都是真的,所以要得到并返回真值,两个操作数中的任何一位都必须是1。相反,如果两个操作数都没有共同的1位,则返回false。

“从逻辑上讲,您可能认为按位AND表示二进制中的所有数字都是