반응형
'마스크된' 비트셋 증가
현재 트리 열거자를 작성하는 중에 다음과 같은 문제가 발생했습니다.
마스크된 비트셋, 즉 세트 비트가 마스크의 서브셋인 비트셋을 보고 있습니다.0000101
가면을 쓰고1010101
제가 달성하고자 하는 것은 마스크된 비트에 대해서만 비트셋을 늘리는 것입니다.이 예에서 결과는 다음과 같습니다.0010000
조금 더 명확하게 하기 위해 마스크된 부분만 추출합니다.0011
, 이 값을 로 늘립니다.0100
마스크 비트에 다시 배포하여0010000
.
비트스캔과 프리픽스 마스크를 조합하여 수동으로 조작하는 것 외에 효율적인 방법을 알고 있는 사람이 있습니까?
비마스크 비트를 1로 채우면 다음과 같이 전파됩니다.
// increments x on bits belonging to mask
x = ((x | ~mask) + 1) & mask;
수용된 답변에 비해 직관적이지는 않지만, 이는 다음 3단계로만 작동합니다.
x = -(x ^ mask) & mask;
이는 zch에서 제안하는 바와 같이 검증할 수 있습니다.
-(x ^ mask)
= ~(x ^ mask) + 1 // assuming 2's complement
= (x ^ ~mask) + 1
= (x | ~mask) + 1 // since x and ~mask have disjoint set bits
그러면 그것은 받아들여진 답과 같아집니다.
반복 순서가 그다지 중요하지 않고 감소 연산이 요구를 충족시킬 경우 다음 두 가지 연산만 사용할 수 있습니다.
먼저 시작합시다.
x = mask
이전 가치를 얻을 수 있습니다.
x = (x - 1) & mask
x - 1
part를 지정하면 마지막 0이 아닌 비트가 0으로 변경되고 모든 하위 비트가 1로 설정됩니다.그리고나서& mask
부품은 마스크 비트만 남습니다.
언급URL : https://stackoverflow.com/questions/44767080/incrementing-masked-bitsets
반응형
'programing' 카테고리의 다른 글
세그멘테이션 장애: 11 (0) | 2022.07.16 |
---|---|
Vue 및 Vue-tippy HTML 콘텐츠 (0) | 2022.07.16 |
사용자 지정 Vue-Cli 템플릿 내의 파일 이름 변경 (0) | 2022.07.16 |
C 매크로 정의는 다른 매크로를 참조할 수 있습니까? (0) | 2022.07.16 |
Vue: utils vue 구성 테스트 - 루트.$route (0) | 2022.07.16 |