C需要的解释

interpretation needed for C

我是 C 语言的新手,最近寻求有关堆栈溢出的代码帮助,一位非常棒的人给了我这段代码。


for(int m = 1; m < 262144; m <<= 1) putc("\n12345"[!!(96221 & m) + !!(26520 & m) + !!(18192 & m) + !!(1536 & m) + !!(1024 & m)], stdout);

打印出来

1
123
12345
123
1

这正是我要找的。

但是我不知道这段代码是如何工作的,而且我上面有 google 这些东西,但我找不到/理解它。

特别是 ‘ <<=,所有那些奇怪的巨大数字。 ‘ 这两个。

那么,有人可以解释一下这段代码是如何工作的吗?并解释一下代码的每一部分是什么?

我不确定给你这段代码的人是聪明还是狡猾...这看起来像是故意混淆的代码:)

m <<= 1

上面的意思是“将m中的位左移一位”,达到m乘以2的效果

putc(..., stdout);

putc( 是一个将单个字符打印到文件的函数(在本例中,打印到 stdout

"\n12345"[!!(96221 & m) + !!(26520 & m) + !!(18192 & m) + !!(1536 & m) + !!(1024 & m)]

此行计算要打印的字符。 "\n12345" 是一个可供选择的字符数组,然后 [brackets] 内的文本正在计算该数组的索引(0 到 5 之间);该索引处的字符将是打印的字符。

!! 前缀是布尔值 not-operator 的 double-applications,用于将括号中的值如果是 non-zero 则转换为 1,如果是 non-zero 则转换为 0零。

(blah & m) 部分正在检查给定的 integer-constant 以查看是否在该常量中设置了特定位。如果设置了特定位,则会将 1 添加到将用于计算数组索引的总和中。我认为我不够聪明,无法详细说明为什么选择这些特定数值 :)