도전
값의 범위가 0-255 인 두 정수를 허용하고 해당 정수 mod 256의 합을 리턴하는 함수를 구현하십시오. 비트 이동 (~), 비트 또는 (|) 비트 이동 연산자 (>>, <<) 만 사용할 수 있습니다. 및 할당 (=)
사용할 수없는 것에는 다음이 포함되지만 이에 국한되지는 않습니다.
- 더하기, 빼기, 곱하기 및 나누기
- 루프
- 조건문
- 함수 호출
이진 또는 이진 부정 및 비트 시프트 연산의 사용이 가장 적습니다 . 동점 일 경우 가장 인기있는 솔루션이 승리합니다. 항상 그렇듯이 표준 허점이 적용됩니다.
다음은 간단한 2 비트 가산기의 예입니다. 총 107 점으로 77 개의 이진 부정, 28 개의 이진 or 및 2 개의 비트 시프트를 사용합니다 (이는 C 프리 프로세서를으로 실행하여 볼 수 있음 gcc -E
). 을 제거 #define
하고 결과 표현식을 단순화하여 훨씬 효율적으로 만들 수 있지만 명확성을 위해 남겨 두었습니다.
#include <stdio.h>
#define and(a, b) (~((~a)|(~b)))
#define xor(a, b) (and(~a,b) | and(a,~b))
int adder(int a, int b)
{
int x, carry;
x = xor(and(a, 1), and(b, 1));
carry = and(and(a, 1), and(b, 1));
carry = xor(xor(and(a, 2), and(b, 2)), (carry << 1));
x = x | carry;
return x;
}
int main(int argc, char **argv)
{
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (adder(i, j) != (i + j) % 4) {
printf("Failed on %d + %d = %d\n", i, j, adder(i, j));
}
}
}
}
업데이트 : 예제 추가 및 점수 기준 변경