c - 0 != 在此代码中做什么?

标签 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 !=部分,如果我删除它,它就不起作用。

有没有深入讲解位运算的网站?

最佳答案

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&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

关于c - 0 != 在此代码中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10596458/

相关文章:

c++ - 非线性颜色插值?

c - 没有编译错误,但给定输入时崩溃

deployment - 混淆的 JavaFX JAR 中的 FXML 找不到 Controller 类

java - 加密Android代码?

proguard - 您如何解读反混淆后的 Android 崩溃报告?

C:图像(数组)的索引公式,在嵌套for循环中更新索引

c - 在软件上生成模拟输入/输出的方波

javascript - 如果我们混淆了代码,那么我们如何调试和修改它?

android - 在 Android Studio 中使用 ProGuard 时无法构建应用程序

ios - 火力地堡 Crashlytics : Upload missing dSYMs to see crashes from 1 versions. (iOS)