첫째, 당신은 이렇게 될 매크로를 수정해야합니다 :
#define SETBIT(X,Y) ((X) |= 1ULL << (Y))
#define UNSETBIT(X,Y) ((X) &= ~(1ULL << (Y))))
SETBIT(a, 2) + 1;
같은 그런 식으로 코드가 더 기대처럼 작동 것이라고 예상대로 SETBIT(1+a, 2);
이 오류가 발생합니다.
그런 식으로 매크로를 사용하지는 않겠지 만 여분의 괄호는 아무렇게나 사용할 수 있으며 매크로 관련 문제를 해결하는 데 PITA를 사용할 수 있습니다. 매크로는 항상 ()
또는 {}
입니다.
ADDITION : 다음
X = X OR (0xFFFFFFFFFFFFFFFE ROL Y)
: 컴파일 시간에 알려져 있지 Y
가정 인라인 어셈블리 및 비트 회전 동작으로 CPU 및 으로 UNSETBIT는 NOT ... 의사 코드 피 빠르게 할 수있다 그 매크로가수록 효율적있는 동안 (C 컴파일러는 이상적인 조립 지침에 최적화해야한다), 당신은 아마도 같은 여러 비트를 조작하는 매크로를 제공해야한다 : 또한
#define SET2BITS(X, B1, B2) ((X) |= 1ULL << (B1) | 1ULL << (B2))
기능처럼 (컴파일러 최적화 아마 어쨌든 같은 최종 결과를 달성 할 수 있지만) 어떤 상황에서보다 효율적으로 될 수 내부 표현을 사용하는 매크로 :
#define BITSETVAL(X, B) ((X) | 1ULL << (B))
번호와 번호는이 빨리 당신이 얻을과 같습니다. –
컴퓨터에 대한 asm을 알고 컴파일러가이 기능을 지원한다면 항상 인라인 어셈블리가 있습니다 ... – user1824407
'bitset' 클래스를 사용해 보았습니다 ... – Anirudha