2013-11-24 3 views
3

0이 아닌 부호없는 정수에는 0x00000001 또는 0xFFFFFFFF를 얻는 효율적인 방법이 있고 분기하지 않고 0 정수에는 0이 있습니까? 여러 개의 마스크를 테스트하고이를 기반으로 다른 마스크를 만들고 싶습니다. 기본적으로, 나는 다음과 같은 코드를 최적화 할 :비트 벡터를 하나의 비트로 변환하십시오.

unsigned getMask(unsigned x, unsigned masks[4]) 
{ 
    return (x & masks[0] ? 1 : 0) | (x & masks[1] ? 2 : 0) | 
      (x & masks[2] ? 4 : 0) | (x & masks[3] ? 8 : 0); 
} 

좀 최적화 컴파일러는이 문제를 해결할 수 있다는 것을 알고,하지만 그런 경우 경우에도, 그들은 그것을 정확히 어떻게해야합니까? 'Bit twiddling hacks'페이지를 살펴 보았지만 조건부 설정/부울 조건을 사용하는 마스크 지우기에 대한 설명 만 발견되었으므로 int에서 bool 로의 변환은 메소드 밖에서 수행해야합니다. 이 문제를 해결할 일반적인 방법이 없다면 어떻게하면 x86 어셈블러 코드를 사용하여 효과적으로 처리 할 수 ​​있습니까? 고맙습니다!

답변

1

86에서이 작업을 수행하는 일반적인 방법은 다음과 같습니다

test eax, eax 
setne al 
+0

을하지만이 거의 무점포입니다. –

+2

여기서 분기없는 명령어는 jmp 명령어가없는 것으로 해석합니다. 쉬프트 및 xor 해킹은 아마도 느려질 것입니다. – simonzack

+0

고마워요! 왜 그것은 거의 분기가 없다고 생각합니까? 'setne'은 시간이 많이 걸리는 작업입니까? – bkxp

관련 문제