d(a,b){return(sizeof((char)d))^__builtin_popcount(a^b);}
온라인으로 사용해보십시오!
반환 0
쌍 (1)에 의해 다른 경우, 비는 달리 제로. EXIT_SUCCESS
쌍이 1 씩 다르면 다른 값을 반환 하는 것을 고려하지 않는 한 C에서는 약간 특이합니다 .
함수 이름을 깨끗하게 유지하면서 원래대로 sizeof((char)d))
상수를 생성하는 데 사용 합니다 1
.
그런 다음 인수의 XOR의 팝 수로 1을 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를 대신 함수 이름으로 사용해야했습니다.