> 백엔드 개발 > C++ > C에서 64비트 정수 곱셈의 고차 비트를 추출하는 방법은 무엇입니까?

C에서 64비트 정수 곱셈의 고차 비트를 추출하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-19 06:33:02
원래의
569명이 탐색했습니다.

How to Extract the High-Order Bits of a 64-Bit Integer Multiplication in C  ?

64비트 정수 곱셈의 상위 비트 검색

C에서 두 개의 64비트 부호 없는 정수 곱하기(uint64_t) 결과는 곱셈의 하위 비트를 나타내는 값이 되며 결과는 효과적으로 제공됩니다. 모듈로 2^64. 이는 종종 특정 계산에 필요한 상위 비트를 얻는 방법에 대한 의문을 제기합니다.

구현 접근 방식

  1. 128- 비트 곱셈:

컴파일러가 지원하는 경우 128비트 숫자(__uint128_t)는 128비트 곱셈을 수행하고 상위 64비트를 추출하는 것은 상위 비트를 얻는 가장 효율적인 방법을 제공합니다.

  1. 32비트 곱셈 및 64비트 축적:

If 128비트 숫자는 지원되지 않습니다. 이식 가능하고 간단한 해결책은 각 64비트 숫자를 두 개의 32비트 숫자로 나누고, 이에 대해 32비트 곱셈을 수행하고, 주의 깊게 64비트 부분 곱을 누적하는 것입니다. 정수 오버플로를 피하세요.

조립 지침:

다음과 같은 일부 아키텍처의 경우 x86에는 이러한 64비트 정수 곱셈을 수행하도록 설계된 특정 어셈블리 명령어(예: MULH)가 있습니다. 그러나 C에서 이러한 명령어를 사용하려면 어셈블리 프로그래밍에 대한 지식이 필요하며 앞서 언급한 C 접근 방식만큼 이식성이 낮을 수 있습니다.

구현 예:

다음 C 코드 32비트 곱셈 및 64비트 누적 접근 방식을 구현합니다.

uint64_t mulhi(uint64_t a, uint64_t b) {
  uint32_t a_lo = (uint32_t)a;
  uint32_t a_hi = a >> 32;
  uint32_t b_lo = (uint32_t)b;
  uint32_t b_hi = b >> 32;

  uint64_t a_x_b_hi = a_hi * b_hi;
  uint64_t a_x_b_mid = a_hi * b_lo + a_lo * b_hi; // Avoid overflow
  uint64_t b_x_a_mid = b_hi * a_lo;
  uint64_t a_x_b_lo = a_lo * b_lo;

  uint64_t multhi = a_x_b_hi +
                   (a_x_b_mid >> 32) + (b_x_a_mid >> 32) +
                   (a_x_b_lo >> 64);

  return multhi;
}
로그인 후 복사

위 내용은 C에서 64비트 정수 곱셈의 고차 비트를 추출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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