按位和行为是否与预期不同? #包括 #包括 int main(int argc,char*argv[]){ int a=50;//110010 int b=30;//011110 国际单项体育联合会(a&b){ printf(“Hi”); } 返回0; }
上面的代码打印Hi按位和行为是否与预期不同? #包括 #包括 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
#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表示二进制中的所有数字都是