CHAR_BIT는 무엇입니까?
http://graphics.stanford.edu/~seander/bithacks.html 에서 분기하지 않고 정수 절대 값 (abs)을 계산하는 코드를 인용합니다 .
int v; // we want to find the absolute value of v
unsigned int r; // the result goes here
int const mask = v >> sizeof(int) * CHAR_BIT - 1;
r = (v + mask) ^ mask;
특허받은 변형 :
r = (v ^ mask) - mask;
무엇 CHAR_BIT
이며 어떻게 사용합니까?
이 코드는 서명 된 형식에 대한 오른쪽 비트 시프트의 구현 정의 동작에 따라 다릅니다. gcc는 항상 정상적인 동작 (sign-bit-extension)을 제공 할 것을 약속하지만 ISO C는 구현이 상위 비트를 0으로 채울 수 있도록합니다.
이 문제를 해결하는 한 가지 방법 :
#ifdef HAVE_SIGN_EXTENDING_BITSHIFT
int const mask = v >> sizeof(int) * CHAR_BIT - 1;
#else
int const mask = -((unsigned)v >> sizeof(int) * CHAR_BIT - 1);
#endif
귀하 Makefile
또는 config.h
등 정의 할 수 있습니다 HAVE_SIGN_EXTENDING_BITSHIFT
플랫폼에 따라 빌드시.
CHAR_BIT
의 비트 수입니다 char
. 요즘 거의 모든 아키텍처가 바이트 당 8 비트를 사용하지만 항상 그런 것은 아닙니다. 7 비트 바이트를 사용하던 일부 오래된 컴퓨터.
에서 찾을 수 있습니다 <limits.h>
.
원래 질문의 명시 적 질문 (CHAR_BIT은 무엇인가)과 암시 적 질문 (이 작동 방식)에 모두 답하려고합니다.
C 및 C ++의 문자는 C 프로그램이 처리 할 수있는 가장 작은 메모리 단위를 나타냅니다. *
C 및 C ++의 CHAR_BIT는 문자의 비트 수를 나타냅니다. char 유형에 대한 다른 요구 사항으로 인해 항상 8 이상이어야합니다. 실제로 모든 최신 범용 컴퓨터에서는 정확히 8 개이지만 일부 역사적 또는 전문 시스템은 더 높은 값을 가질 수 있습니다.
Java는 CHAR_BIT 또는 sizeof와 동등하지 않으며 Java의 모든 기본 유형이 고정 된 크기이고 객체의 내부 구조가 프로그래머에게 불투명하므로 필요하지 않습니다. 이 코드를 Java로 변환하는 경우 "sizeof (int) * CHAR_BIT-1"을 고정 값 31로 간단히 바꿀 수 있습니다.
이 특정 코드에서는 int의 비트 수를 계산하는 데 사용됩니다. 이 계산은 int 유형에 패딩 비트가 포함되어 있지 않다고 가정합니다.
컴파일러가 부호있는 숫자의 비트 시프트에서 부호 확장을 선택하고 시스템이 음수에 대해 2의 보수 표현을 사용한다고 가정하면 "MASK"는 양수 또는 0 값에 대해 0이고 음수 값에 대해 -1이됩니다.
2의 보수 수를 부정하려면 비트 not을 수행 한 다음 1을 더해야합니다. 동등하게 우리는 1을 뺀 다음 비트로 부정 할 수 있습니다.
다시 2의 보수 표현 -1이 모두 1로 표현된다고 가정하면 배타적 또는 -1은 비트 부정과 동일합니다.
따라서 v가 0이면 숫자는 그대로 남아 있고 v가 1이면 부정됩니다.
주의해야 할 점은 C 및 C ++의 서명 된 오버플로가 정의되지 않은 동작입니다. 따라서 가장 부정적인 값에이 ABS 구현을 사용하면 정의되지 않은 동작이 발생합니다. 프로그램의 마지막 줄이 unsigned int로 평가되도록 캐스트를 추가하여이 문제를 해결할 수 있습니다.
* 일반적으로 하드웨어가 처리 할 수있는 가장 작은 메모리 단위와 동일하지는 않습니다. 구현은 잠재적으로 여러 단위의 하드웨어 주소 지정 가능 메모리를 하나의 프로그램 주소 지정 가능 메모리 단위로 결합하거나 하나의 하드웨어 주소 지정 가능 메모리 단위를 프로그램 추가 가능 메모리의 여러 단위로 분할 할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/3200954/what-is-char-bit
'developer tip' 카테고리의 다른 글
Git / Bower 오류 : 종료 코드 # 128 및 연결 실패 (0) | 2020.09.18 |
---|---|
sizeof가 연산자로 간주되는 이유는 무엇입니까? (0) | 2020.09.18 |
Amazon EC2 인스턴스에 대한 SSH 액세스를 설정하려면 어떻게해야합니까? (0) | 2020.09.18 |
익명 함수 속기 (0) | 2020.09.18 |
"이 작업을 수행하는 동안 오류가 발생했습니다." (0) | 2020.09.18 |