0!=在这段代码中做什么?

时间:2012-05-15 07:59:19

标签: c obfuscation deobfuscation

此代码中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 !=部分&amp;如果我删除它就不起作用。

是否有任何网站深入教授按位操作?

1 个答案:

答案 0 :(得分:4)

a != b

表达式是等于true还是false。在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)))

(~i&amp; 7)取i,翻转其中的所有位,然后将所有位转换为7位。

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

取1并左移~1&amp; 7位。

a & b

aANDSb中的所有位相关联。

一些链接:

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

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

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