1

0 !=这段代码做了什么:

#include <stdio.h>
int main()
{
    int i;
    for(i=0;i<8*5;i++)
        printf("%d",0 != ("HELLO"[i/8] & 1 << (~i&7)) );
    return 0;
}

这是一个简单的字符串到二进制的转换。我理解,`("HELLO"[i/8] & 1 << (~i&7))但我无法理解该0 !=部分,如果我删除它,它就不起作用。

有没有深入教授按位运算的网站?

4

1 回答 1

5
a != b

是一个等于真或假的表达式。在 C 中,没有trueand false,而是 0 被认为是假的,其他任何东西都被认为是真的。一个表达式a != b如果为假则返回 0,如果为真则返回 1。%d 是打印出整数的格式字符串,因此 printf() 将打印这个 0 或 1。

在这种情况下,a 是 0,b 是另一边表达式的野兽。("HELLO"[i/8] & 1 << (~i&7)) 详细说明一下其他操作:

("HELLO"[i/8] & 1 << (~i&7))应该添加括号以使其更清晰:

(("HELLO"[i/8]) & (1 << (~i&7)))

(~i&7) 取 i,翻转其中的所有位,然后将所有位与 7 位相加。

(1 << (~i&7)))

取 1 并左移 ~i&7 个位置。

a & b

需要aANDS所有的位与那些在b

几个链接:

http://en.wikipedia.org/wiki/Bitwise_operation

http://www.cprogramming.com/tutorial/bitwise_operators.html

http://msdn.microsoft.com/en-us/library/17zwb64t.aspx

于 2012-05-15T08:04:41.703 回答