我一直在关注位级操作的教程。我正在处理的代码如下:
int main(void){
puts("bit-level calculations:");
puts("----------------------");
unsigned int x = 10;
unsigned int y = 1;
unsigned int result;
result = x&y;
printf("x & y = %d\n", result);
result = x|y;
printf("x | y = %d\n", result);
result = x^y;
printf("x ^ y = %d\n", result);
}
结果如下:
x& y = 0
x | y = 11
x ^ y = 11
然而我的问题是第一个答案。我所理解的是1& 0 = 0,但1& 1 = 1,我所期待的是我应该得到答案 至少10& 1 = 10.因为x的第一位是1,y的第一位是1。并且x的第二位是0,y位是0,所以结果应该是0。问题是为什么我只得到零,或者和Xor我得到两位作为结果。
非常感谢你。我知道有一些关于比特级操作的问题,但答案并没有澄清我的问题。答案 0 :(得分:2)
请记住,这些是二进制运算符。你必须看看数字的基数2位,而不是它们的数字,它们是10位。让我们这样做。我将使用下标来指出每个数字写入的基数。
首先,让我们将数字转换为基数2 。
10 10 = 1010 2 (基础10中的10个是基础2中的“1010”)
1 10 = 1 2 (在任一基数中,一个写成“1”)
接下来,我们必须记住工作从右到左,而不是从左到右。我们可以通过用0填充数字来做到这一点。正如37与十进制中的037相同 - 三十七<1> 2 与二进制中的0001 2 相同。
10 10 = 1010 2
01 10 = 0001 2
现在执行二进制操作。你现在看到为什么1010 2 &amp; 0001 2 等于0000 2 ?
答案 1 :(得分:1)
执行按位运算时始终考虑基数。它在程序中默认为十进制。
10 10 和 0xa 和 012 和 0b1010 和 1010 2 ,所有都是相同的符号。
也就是说,正如您的十进制10 10 是1 * 10 + 0,它也是1 * 2 3 + 2 1 或也许,混合基数,8 + 2,所以二进制,01010 2 。
当你通过运算符与1结合使用时(在每个基数中都是相同的),你将匹配10 10 中最右边的0。
答案 2 :(得分:0)
10和1的二进制表示如下
10 = 1010
1 = 0001
所以:
10&amp; 1
= 1010&amp; 0001
= 0000
答案 3 :(得分:0)
在某些版本的gcc
and other compilers中,您可以使用文字二进制值,即
unsigned int x = 0b10;
unsigned int y = 0b01;
然后它将以你想要的方式工作。