비트 연산자에 대한 자세한 설명과 비트 연산 팁

오늘 비트 연산자에 대해 알아보십시오.

여기에 이미지 설명 삽입

오늘도 즐겁게 공부하세요!

1. 운영자는 무엇입니까? 사용 방법?

& Bitwise AND: Bitwise 연산 1과 동일 , 나머지는 0
| Bitwise OR: Bitwise 연산 0과 동일 , 나머지는 1
^ Bitwise XOR: Bitwise 연산 Difference
is 1, same 0 ~ Negation: bit- by Bit-wise 반전 (단항 연산자)
<< 왼쪽 시프트: 왼쪽 비트별로 왼쪽 시프트 0을 보완
>> 오른쪽 시프트: 비트 단위 오른쪽 시프트 부호가 있는 최상위 비트를 보완하기 위해 부호 비트, 부호 없는 숫자의 경우 0 채우기 .
~의 부정을 제외하고 다른 모든 것은 이항 연산자입니다.

2. 비트 연산자는 어떤 데이터 유형에 적용할 수 있습니까?

대답은 부동 소수점 계열이 아닌 정수 계열에만 적용된다는 것입니다.
근본적인 이유는 둘의 데이터 저장 유형이 다르기 때문입니다.
플라스틱 가족의 보관은 이전 기사에서 언급 했으므로 반복하지 않겠습니다.

  • 정수 계열
    의 저장 방식 부동 소수점 계열의 저장 방식은 IE754 규정을 준수해야 합니다.

3. 비트 및 비트 또는 비트 XOR의 예

예 1: 이진수에서 1의 수를 찾으십시오. &(비트 AND)

    int a = 0;
	scanf("%d", &a);
	int count = 0;
	while (a)
	{
    
    
		a = a&(a - 1);//每次把最低位丢弃,直到a为0.
		count++;
	}
	printf("%d\n", count);

예 2: |(비트별 OR)를 사용하여 이진법에서 0의 개수 찾기

	int a = 0;
	int count = 0;
	scanf("%d", &a);
 	while (a+1)
	{
    
    
		a = a | (a + 1);
		count++;
	}
	printf("%d\n", count);

이 코드는 매우 흥미롭습니다. 데이터 오버플로 후 잘림을 사용하여 판단 조건을 참으로 만듭니다.
우선 a+1은 0을 포함해야 하기 때문에 판단에 사용합니다. 더 공교롭게도 a+1이 0일 때 is -1이 발생합니다. 우리는 2의 보수에 0이 없다는 것을 압니다. of -1. , 그래서 그냥 일치합니다. 한 번에 한 비트를 1로 만들고 마지막으로 데이터를 음수(-1)로 만들고 1을 더하여 0이 되고 루프를 종료하는 데 사용됩니다.

예 3: ^(비트 배타적 OR)를 사용하여 두 변수의 값을 교환합니다.

우선 가장 기본적인 몇 가지 결론을 알아야 합니다.
1. 숫자 XOR 0 또는 자체.
2. 숫자 XOR 자체는 0
입니다. 이것은 XOR 개념에서 파생된 것입니다.

이 질문을 다시 살펴보겠습니다. 아이디어가 있습니까?
먼저 a XOR b를 수행한 다음 b = b^ b^a와 동일한 XOR을 수행합니다.
유사하게 a를 얻을 수 있습니다.

    int a = 10;
	int b = 20;
	printf("before:%d %d\n", a, b);
	a = a^b;
	b = a^b;
	a = a^b;
	printf("after:%d %d\n", a, b);

아래는 수학입니다.

    int a = 10;
	int b = 20;
	printf("before:%d %d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("after:%d %d\n", a, b);

수학적 방법에 비해 XOR 방법의 가장 큰 장점은 오버플로 문제를 고려할 필요가 없다는 점으로, 두 개의 매우 큰 숫자를 수학적으로 연산하면 오버플로가 발생할 수 있습니다.

4. 왼쪽 시프트 오른쪽 시프트 연산자

왼쪽으로 이동하는 것은 상대적으로 간단하여 상위 비트를 버리고 하위 비트를 0으로 채웁니다.
오른쪽 시프트의 경우에 대해 설명합니다.
산술 오른쪽 시프트: 부호 있는 숫자의 경우 최상위 비트에 부호 비트가 추가됩니다.
논리적 오른쪽 시프트: 부호 없는 숫자의 경우 최상위 비트가 0으로 채워집니다.

예를 참조하십시오.

    int a = -1;
	unsigned int b = -1;
	printf("%d\n", a >> 1);
	printf("%u\n", b >> 1);

여기에 이미지 설명 삽입
실행 후, -1이 먼저 출력된 다음 2 30 -1이 출력 됨을 알 수 있다 .
먼저 a>>1을 분석한다. a는 부호 있는 음수이므로 채울 때 가장 높은 비트 기호는 1이고 마지막 비트 기호는 보수 값은 여전히 ​​모두 1입니다.
b>>1을 보십시오. b는 부호 없는 숫자이므로 비트를 채울 때 가장 높은 비트는 0으로 채워지고 마지막으로 첫 번째 비트는 0이고 나머지 비트는 1입니다.

그렇다면 이동 범위는 어떻게 될까요?
먼저 int형의 데이터는 32비트 밖에 없으므로 최대 시프트는 31비트인데 최소값은 어떻게 될까요? 최소값이 **-31비트입니까? **아니요, 왼쪽 또는 오른쪽 시프트는 음수 비트를 이동할 수 없습니다.
따라서 시프트 범위는 0~31비트입니다.


우선순위 문제 의 예 를 살펴보겠습니다.

    int a = 1;
	a = a << 2 + 3;
	printf("%d", a);

우선 결과는 32이므로 이렇게 보면 (2+3)이 먼저 나온 다음 시프트가 수행됩니다.
따라서 시프트 문자를 사용할 때 우선 순위 문제를 고려해야 합니다.

5. 교대 근무자 적용

비트 단위 위치는 시프트 연산자를 사용하여 0 또는 1로 설정할 수 있습니다
.

    unsigned int a = 1;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
    
    
		a = a|(a << i);
	}
	printf("%d", a);

마지막은 부호 있는 숫자이므로 -1로 인쇄됩니다.

비트 단위, 0으로 설정

    unsigned int a = -1;
	for (int i = 0; i < 32; i++)
	{
    
    
		a = a & (a >> i);

	}
	printf("%d", a);

는 부호가 없는 숫자이기 때문에 비트를 보완할 때 0을 더하고 시프트 후 비트 OR을 수행합니다. 마지막 인쇄는 0입니다.

6. 몇 가지 팁

  1. x&1 == 0으로 짝수인지 판단하고 짝수의 마지막 비트는 0입니다.
  2. 두 숫자의 값은 XOR로 교환할 수 있습니다.
  3. x & (x-1)는 맨 오른쪽 비트의 1을 0으로 만들 수 있습니다.
  4. 양수의 경우 x&(x-1)==0 은 2의 거듭제곱인지 판단하는 것입니다.
  5. 두 개의 동일한 숫자를 XOR하면 결과는 0이고 숫자를 0과 XOR하면 결과가 자체입니다. 숫자를 찾는 데 사용할 수 있습니다.

7. 다음 공지사항

이 문제는 여전히 ++ 항목 작성을 완료하지 않았습니다. 다음 호에서는 ++ 및 – 관련 지식에 대해 이야기하겠습니다.
다음화는 더 신나게~~~
여기에 이미지 설명 삽입

추천

출처blog.csdn.net/m0_64770095/article/details/124022347