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 添加到将用于计算数组索引的总和中。我认为我不够聪明,无法详细说明为什么选择这些特定数值 :)
我是 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 添加到将用于计算数组索引的总和中。我认为我不够聪明,无法详细说明为什么选择这些特定数值 :)