d(a,b){return(sizeof((char)d))^__builtin_popcount(a^b);}
在线尝试!
0
如果该对相差1,则返回,否则返回非零。对于C来说有点不寻常,除非您认为EXIT_SUCCESS
如果该对相差1,则返回C,否则返回其他值。
用于sizeof((char)d))
以1
原始方式生成常数,同时也强制函数名称为原始。
然后,将1与参数XOR的popcount进行XOR运算。幸运的是,^
符号很容易保持原始,很长的标识符也是如此__builtin_popcount
。
同时,这是用于测试解决方案的脚本:
#!/bin/bash
SOURCE_FILE=$1
FOOT_FILE=$2
TMP_SRC=temp.c
LENGTH="$(wc -c <"$SOURCE_FILE")"
BITS=$((LENGTH*8))
cat "$SOURCE_FILE" >"$TMP_SRC"
cat "$FOOT_FILE" >>"$TMP_SRC"
if gcc -w $TMP_SRC -o t.out >/dev/null 2>&1; then
if ./t.out; then
echo "Candidate solution..."
else
echo "Doesn't even work normally..."
exit
fi
else
echo "Doesn't even compile..."
exit
fi
for i in $(seq 1 $BITS); do
./flipbit "$i" <"$SOURCE_FILE" >"$TMP_SRC"
cat "$FOOT_FILE" >>"$TMP_SRC"
if gcc -w $TMP_SRC -o t.out >/dev/null 2>&1; then
echo "Testing flipped bit $i:"
cat "$TMP_SRC"
./t.out >/dev/null 2>&1
STATUS=$?
if [ "$STATUS" -eq 0 ]; then
echo "It works!"
exit
elif [ "$STATUS" -eq 1 ]; then
echo "It doesn't work..."
exit
else
echo "It crashes"
fi
fi
done
使用./flipbit
我编写的工具的来源很简单:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int bittoflip = atoi(argv[1]) - 1;
int ch;
while ((ch = fgetc(stdin)) != EOF) {
if (bittoflip < 8 && bittoflip >= 0) {
putchar(ch ^ (1 << bittoflip));
} else {
putchar(ch);
}
bittoflip -= 8;
}
return 0;
}
棘手的是:
- 空格:所有空格(包括换行符)都有原始的双胞胎,它们的工作原理类似
- 比较:
=
效果不好,因为在每种情况下它都可能是一个比较。同样,效果-
也不佳。从而^
用于断言与1相等。
- 变量名称:f与b冲突,因此必须使用d作为函数名称。