2012-05-15 51 views
1

什么0 !=做这样的代码: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 !=部分&如果我删除它不起作用。

是否有任何网站教授深度按位运算?

+0

看起来毕竟你不明白的第二部分... –

回答

4
a != b 

是等同于真或假的表达式。在C中,没有truefalse,而是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))) 

(〜我& 7)需要我,翻转所有位的话,那么ANDS所有的位的位数为7.

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

需要1并左移它〜我& 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

+0

另外补充:'0 =( “HELLO”[i/8]&1 <<(〜i&7))实际上是一个布尔表达式,其值为“true”或“false”。所以代码将打印0或1. – Hindol

+0

@Hindol第一段详细解释,虽然我想我可以添加一个片段来澄清 – Corbin

+0

谢谢你的答案。我知道按位操作,但有时我只是想知道人们如何找到“TRICKS”可以避免一些冗长的事情发生到简单的班轮。 – wenn32