산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C# 비트 연산자와 시프트 연산자 완전 정복: 종합 가이드

C# 비트 연산자와 시프트 연산자

이 튜토리얼에서는 C#의 비트 연산자와 비트 시프트 연산자를 상세히 다룹니다. C#은 4가지 비트 연산자와 2가지 시프트 연산자를 제공합니다.

비트 연산자와 시프트 연산자는 정수(int, long 등) 및 불리언 데이터에 비트 수준 연산을 수행하는 데 사용됩니다. 실무에서는 자주 쓰이지 않지만, 로우 레벨 최적화나 플래그 처리 등에 유용합니다.

C# 비트 연산자 목록
연산자이름
~비트 보수 (Bitwise Complement)
&비트 AND (Bitwise AND)
|비트 OR (Bitwise OR)
^비트 배타적 OR (Bitwise XOR)
<<비트 왼쪽 시프트 (Left Shift)
>>비트 오른쪽 시프트 (Right Shift)

비트 OR (|)

비트 OR 연산자 |는 두 피연산자의 대응하는 비트끼리 OR 연산을 수행합니다. 두 비트 중 하나라도 1이면 결과는 1, 아니면 0입니다.

피연산자가 bool 타입이면 논리 OR 연산과 동일합니다.

예시: 14 | 11

14 = 00001110 (이진수)
11 = 00001011 (이진수)

비트 OR 연산:

 00001110
 00001011
 --------
 00001111 = 15 (십진수)

예제 1: 비트 OR

using System;
namespace Operator {
    class BitWiseOR {
        public static void Main(string[] args) {
            int firstNumber = 14, secondNumber = 11, result;
            result = firstNumber | secondNumber;
            Console.WriteLine("{0} | {1} = {2}", firstNumber, secondNumber, result);
        }
    }
}

출력:

14 | 11 = 15

비트 AND (&)

비트 AND 연산자 &는 대응하는 비트끼리 AND 연산을 수행합니다. 두 비트 모두 1일 때만 결과가 1, 아니면 0입니다.

bool 타입이면 논리 AND와 동일.

예시: 14 & 11

14 = 00001110
11 = 00001011

비트 AND 연산:

 00001110
 00001011
 --------
 00001010 = 10 (십진수)

예제 2: 비트 AND

using System;
namespace Operator {
    class BitWiseAND {
        public static void Main(string[] args) {
            int firstNumber = 14, secondNumber = 11, result;
            result = firstNumber & secondNumber;
            Console.WriteLine("{0} & {1} = {2}", firstNumber, secondNumber, result);
        }
    }
}

출력:

14 & 11 = 10

비트 XOR (^)

비트 XOR 연산자 ^는 대응하는 비트가 서로 다를 때 1, 같을 때 0을 반환합니다.

bool 타입이면 논리 XOR과 동일.

예시: 14 ^ 11

14 = 00001110
11 = 00001011

비트 XOR 연산:

 00001110
 00001011
 --------
 00000101 = 5 (십진수)

예제 3: 비트 XOR

using System;
namespace Operator {
    class BitWiseXOR {
        public static void Main(string[] args) {
            int firstNumber = 14, secondNumber = 11, result;
            result = firstNumber ^ secondNumber;
            Console.WriteLine("{0} ^ {1} = {2}", firstNumber, secondNumber, result);
        }
    }
}

출력:

14 ^ 11 = 5

비트 보수 (~)

비트 보수 연산자 ~는 단항 연산자로, 피연산자의 각 비트를 반전시킵니다(1→0, 0→1).

예시: ~26

26 = 00011010 (이진수)
~26 = 11100101 = 229 (십진수, 부호 없는 정수로 해석 시)

예제 4: 비트 보수

using System;
namespace Operator {
    class BitWiseComplement {
        public static void Main(string[] args) {
            int number = 26, result;
            result = ~number;
            Console.WriteLine("~{0} = {1}", number, result);
        }
    }
}

출력:

~26 = -27

기대했던 229가 아닌 -27이 출력되었습니다. 왜 그럴까요?

이유는 11100101이 2의 보수 표현으로 -27을 나타내기 때문입니다. 컴퓨터에서 음수는 2의 보수로 표현됩니다.

임의의 정수 n에 대해, 2의 보수는 -(n+1)입니다.

2의 보수 예시
십진수이진수2의 보수
000000000-(11111111 + 1) = -0
100000001-(11111110 + 1) = -256
22911100101-(00011010 + 1) = -27

오버플로우 비트는 무시됩니다. 따라서 26의 비트 보수는 229지만, 2의 보수 표현으로는 -27이 됩니다.


비트 왼쪽 시프트 (<<)

왼쪽 시프트 연산자 <<는 비트를 왼쪽으로 지정된 수만큼 이동시킵니다. 빈 자리는 0으로 채워집니다.

십진수로는 num * 2^bits와 동일합니다.

예시: 42 << n

42 = 101010 (이진수)
42 << 1 = 84  (1010100)
42 << 2 = 168 (10101000)
42 << 4 = 672 (1010100000)

예제 5: 왼쪽 시프트

using System;
namespace Operator {
    class LeftShift {
        public static void Main(string[] args) {
            int number = 42;
            Console.WriteLine("{0}<<1 = {1}", number, number<<1);
            Console.WriteLine("{0}<<2 = {1}", number, number<<2);
            Console.WriteLine("{0}<<4 = {1}", number, number<<4);
        }
    }
}

출력:

42<<1 = 84
42<<2 = 168
42<<4 = 672

비트 오른쪽 시프트 (>>)

오른쪽 시프트 연산자 >>는 비트를 오른쪽으로 이동시킵니다. 부호 있는 정수의 경우 부호 비트(최상위 비트)가 복사되어 채워집니다(산술 시프트).

십진수로는 floor(num / 2^bits)와 유사합니다.

예시: 42 >> n

42 = 101010 (이진수)
42 >> 1 = 21  (010101)
42 >> 2 = 10  (001010)
42 >> 4 = 2   (000010)

예제 6: 오른쪽 시프트

using System;
namespace Operator {
    class RightShift {
        public static void Main(string[] args) {
            int number = 42;
            Console.WriteLine("{0}>>1 = {1}", number, number>>1);
            Console.WriteLine("{0}>>2 = {1}", number, number>>2);
            Console.WriteLine("{0}>>4 = {1}", number, number>>4);
        }
    }
}

출력:

42>>1 = 21
42>>2 = 10
42>>4 = 2

C 언어

  1. C# 키워드와 식별자 이해: 규칙, 목록, 모범 사례
  2. C# 연산자 – C# 연산자 종합 가이드
  3. C# 비트 연산자와 시프트 연산자 완전 정복: 종합 가이드
  4. C++ 연산자 마스터하기: 유형별 완벽 가이드와 실전 예제
  5. C 프로그래밍 연산자 완벽 가이드
  6. 파이썬 연산자 마스터하기: 종합 가이드
  7. Java 연산자 마스터하기: 종류, 문법, 실전 예제
  8. IoT와 블록체인: 데이터 신뢰와 효율성의 패러다임 전환
  9. C++ 연산자 총정리: 종류, 예제, 샘플 프로그램
  10. C 비트 연산자 마스터: AND, OR, XOR, 시프트, 컴플리먼트