控制语句'if((i + j)& 1)'背后的逻辑是什么?

时间:2015-08-28 18:36:43

标签: c arrays char

该程序声明一个8x8字符数组,然后使用循环将以下数据存储到数组中(每个数组元素一个字符)。然后它将此数组打印到屏幕:

BRBRBRBR

RBRBRBRB

BRBRBRBR

RBRBRBRB

BRBRBRBR

RBRBRBRB

BRBRBRBR

RBRBRBRB

程序运行正常。但是,我无法理解if语句背后的逻辑:

if((i+j) & 1)

我不明白如果添加i + j'和'1是真的设置数组到'R',否则将其设置为'B'。这可能有一个相当明显的答案,但我是C的新手。有人可以帮助澄清为什么这个程序适用于这个逻辑?谢谢!

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


int main(void)
{
    int i, j;
    char letter[8][8];
    for(i=0; i<8; i++) {
        for(j=0; j<8; j++) {
            //This if-statement
            if ((i+j) & 1)
                letter[i][j] = 'R';
            else 
                letter[i][j] = 'B';
            printf("%c" , letter[i][j]);
        }
        printf("\n");
    }
    return 0;
}

2 个答案:

答案 0 :(得分:5)

(i+j) & 1为奇数时,

true将评估为i+j; false为偶数时,i+j将评估为&

该表达式中的int is_odd(int n) { return ((n&1) == 1); } ... if ( is_odd(i+j) ) 是按位AND运算符,而不是逻辑AND运算符。

如果编写为:

,代码将更具可读性
ready = ->
  alert "page loaded"

  $('a').click ->
      alert "link clicked"


$(document).ready(ready)
$(document).on('page:load', ready)

答案 1 :(得分:1)

这里有一个模式 - 值的最后一位经常翻转:

i = 0, j = 0 --> i + j = 0 --> 2'b00
i = 0, j = 1 --> i + j = 1 --> 2'b01
i = 0, j = 2 --> i + j = 2 --> 2'b10
...and so on

然后&运算符对值的位执行逐位and运算:

//this evaluates to false, and 'B' is printed
2'b00 & 1 == 2'b00 & 2'b01 == 2'b(0&0)(0&1) == 2'b00 
//this evaluates to true, and 'R' is printed
2'b01 & 1 == 2'b01 & 2'b01 == 2'b(0&0)(1&1) == 2'b01