> 백엔드 개발 > C++ > 비트 세트의 한 위치 또는 낮은 위치에서 세트 비트를 효율적으로 계산하는 방법은 무엇입니까?

비트 세트의 한 위치 또는 낮은 위치에서 세트 비트를 효율적으로 계산하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-04 03:10:10
원래의
673명이 탐색했습니다.

How to Efficiently Count Set Bits at a Position or Lower in a Bitset?

위치 이하에서 효율적으로 세트 비트 계산

문제 설명:

표준::bitset<64> 임의의 비트 값과 비트 위치 X(0-63)를 사용하여 위치 X 이하의 비트를 계산하는 가장 효율적인 방법을 결정하거나 X의 비트가 설정되지 않은 경우 0을 반환합니다.

최적화된 솔루션:

다음 C 코드는 지정된 비트 내에서 세트 비트를 효율적으로 계산하는 고도로 최적화된 x86 ASM을 생성합니다. 범위:

#include <bitset>

int popcount_subset(std::bitset<64> bits, int pos) {
    int high_bits_to_eliminate = 63 - pos;
    bits <<= high_bits_to_eliminate & 63; // Shift to place desired bits at the top
    return (bits[63] ? ~0ULL : 0) & bits.count(); // Broadcast high bit or return 0, then popcount
}
로그인 후 복사

구현 세부 정보:

  1. 시프트 작업: 비트 세트는 63만큼 왼쪽으로 이동합니다. 64비트 레지스터의 상단에 원하는 비트를 추가합니다. 이렇게 하면 불필요한 비트가 카운트에서 제거됩니다.
  2. 비트 브로드캐스트: 이동된 비트 세트의 상위 비트는 산술 오른쪽 시프트를 사용하여 모든 비트 위치에 브로드캐스트됩니다. 이는 상위 비트가 설정된 경우(즉, pos의 비트가 설정된 경우) 모든 비트가 설정되고 그렇지 않은 경우 모든 비트가 지워지는 마스크를 생성합니다.
  3. 조건부 팝 카운트: AND 연산 비트셋을 마스크와 결합합니다. pos의 비트가 설정되면 마스크는 ~0ULL이 되어 원래 팝카운트가 됩니다. 그렇지 않으면 마스크가 0이 되어 팝카운트가 0이 됩니다.
  4. 최적의 ASM: 이 코드는 하드웨어 팝카운트 명령어와 비트 브로드캐스트를 활용하여 64비트 아키텍처에서 효율적인 x86 ASM을 생성합니다.

이점:

  • 지정된 범위 내에서 세트 비트를 계산하는 데 효율적입니다.
  • 임의의 비트 세트 크기에 대해 작동합니다. 그에 따라 상수를 조정합니다.
  • 많은 아키텍처에서 고도로 최적화된 ASM을 생성합니다. x86-64 및 ARM64를 포함합니다.
  • 정의되지 않은 동작 없이 pos가 비트 세트 크기를 초과하는 경우를 처리합니다.

위 내용은 비트 세트의 한 위치 또는 낮은 위치에서 세트 비트를 효율적으로 계산하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿