C 언어
이 튜토리얼에서는 C#의 비트 연산자와 비트 시프트 연산자를 상세히 다룹니다. C#은 4가지 비트 연산자와 2가지 시프트 연산자를 제공합니다.
비트 연산자와 시프트 연산자는 정수(int, long 등) 및 불리언 데이터에 비트 수준 연산을 수행하는 데 사용됩니다. 실무에서는 자주 쓰이지 않지만, 로우 레벨 최적화나 플래그 처리 등에 유용합니다.
| 연산자 | 이름 |
|---|---|
| ~ | 비트 보수 (Bitwise Complement) |
| & | 비트 AND (Bitwise AND) |
| | | 비트 OR (Bitwise OR) |
| ^ | 비트 배타적 OR (Bitwise XOR) |
| << | 비트 왼쪽 시프트 (Left Shift) |
| >> | 비트 오른쪽 시프트 (Right Shift) |
비트 OR 연산자 |는 두 피연산자의 대응하는 비트끼리 OR 연산을 수행합니다. 두 비트 중 하나라도 1이면 결과는 1, 아니면 0입니다.
피연산자가 bool 타입이면 논리 OR 연산과 동일합니다.
14 = 00001110 (이진수) 11 = 00001011 (이진수)
비트 OR 연산:
00001110 00001011 -------- 00001111 = 15 (십진수)
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 연산을 수행합니다. 두 비트 모두 1일 때만 결과가 1, 아니면 0입니다.
bool 타입이면 논리 AND와 동일.
14 = 00001110 11 = 00001011
비트 AND 연산:
00001110 00001011 -------- 00001010 = 10 (십진수)
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 연산자 ^는 대응하는 비트가 서로 다를 때 1, 같을 때 0을 반환합니다.
bool 타입이면 논리 XOR과 동일.
14 = 00001110 11 = 00001011
비트 XOR 연산:
00001110 00001011 -------- 00000101 = 5 (십진수)
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 = 00011010 (이진수) ~26 = 11100101 = 229 (십진수, 부호 없는 정수로 해석 시)
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의 보수 |
|---|---|---|
| 0 | 00000000 | -(11111111 + 1) = -0 |
| 1 | 00000001 | -(11111110 + 1) = -256 |
| 229 | 11100101 | -(00011010 + 1) = -27 |
오버플로우 비트는 무시됩니다. 따라서 26의 비트 보수는 229지만, 2의 보수 표현으로는 -27이 됩니다.
왼쪽 시프트 연산자 <<는 비트를 왼쪽으로 지정된 수만큼 이동시킵니다. 빈 자리는 0으로 채워집니다.
십진수로는 num * 2^bits와 동일합니다.
42 = 101010 (이진수) 42 << 1 = 84 (1010100) 42 << 2 = 168 (10101000) 42 << 4 = 672 (1010100000)
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 = 101010 (이진수) 42 >> 1 = 21 (010101) 42 >> 2 = 10 (001010) 42 >> 4 = 2 (000010)
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 언어
액체, 반고체 물질, 증기 또는 공기가 애플리케이션에서 사용하기 위해 파이핑을 따라 이동할 때, 물질의 흐름을 조절해야 합니다. 너무 많은 물질은 애플리케이션에 바람직하지 않거나 시스템 손상을 초래하거나 작업자에게 위험할 수 있습니다. 또한 작업자는 장비 유지보수를 수행하거나 공정에 문제가 있을 때 작업을 중단하기 위해 물질의 흐름을 완전히 차단할 방법이 있어야 합니다. 밸브라고 하는 메커니즘이 물질의 흐름을 조절하는 데 사용됩니다. 밸브는 조절하는 물질과 사용되는 시스템에 따라 여러 유형이 있습니다. 공압 밸브는 공압 시스템에서
드릴링은 구멍을 만드는 공정이고, 탭핑은 구멍 안에 나사산을 절삭하는 기술이므로, 드릴 비트와 탭 공구는 나사 구멍이 있는 CNC 부품을 제작하기 위해 순차적으로 자주 사용됩니다. 드릴 비트 크기와 탭 크기 선택 시 참조할 수 있는 표준 드릴 및 탭 크기 차트가 있습니다. 드릴 및 탭 크기 차트란 무엇이며 왜 사용하는가? 맞춤형 CNC 가공 부품 제조 시, 완성된 부품을 고정하거나 조립을 용이하게 하기 위해 나사산이 있는 구멍이 종종 필요합니다. 나사 구멍을 만드는 가장 일반적인 방법은 적절한 크기의 드릴 비트로 구멍을 뚫고 탭으로