位级操作

时间:2016-06-10 22:20:59

标签: c

我一直在关注位级操作的教程。我正在处理的代码如下:

    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我得到两位作为结果。

非常感谢你。我知道有一些关于比特级操作的问题,但答案并没有澄清我的问题。

4 个答案:

答案 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;

然后它将以你想要的方式工作。