일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Python
- Google Spreadsheet
- Kotlin
- google apps script
- Tkinter
- Java
- PySpark
- Github
- Redshift
- array
- string
- PANDAS
- numpy
- PostgreSQL
- Google Excel
- Mac
- c#
- matplotlib
- Apache
- gas
- hive
- django
- Excel
- list
- 파이썬
- math
- SQL
- dataframe
- GIT
- Today
- Total
달나라 노트
C# : <<, >> (비트 시프트 연산자) 본문
<<, >> 연산자는 주어진 수를 2진수로 변경한 후 2진수를 일정 칸만큼 왼쪽 또는 오른쪽으로 이동한 값을 return합니다.
직접 코드를 보기 전에 이게 대체 무슨소리인지 예시를 통해 알아봅시다.
만약 100 >> 2 라고 적는다면 10진수 정수인 100을 2진법으로 나타낸 후 2진법으로 나타내진 숫자를 오른쪽으로 2칸씩 이동시키라는 의미입니다.
숫자 100을 2진법으로 나타내면 1100100 이것과 같습니다.
이동 전 -> 1100100
이동 후 -> 0011001
이동 전/후의 2진법은 위와 같습니다.
이동 전의 숫자를 오른쪽으로 2칸씩 이동시켰으니 가장 오른쪽에 있던 0 두개는 사라지게됩니다. (파란색 0 두개)
그리고 가장 왼쪽에는 2칸의 비어있는 자리가 생기게되니 이 비어있는 자리는 0으로 채웁니다. (보라색 0 두개)
이동 후 만들어진 숫자는 0011001인데 여기서 맨 앞에 있는 2개의 0은 의미가 없습니다. 마치 9와 09가 같은 것 처럼요.
따라서 결국 이동 후 숫자는 11001이 됩니다.
11001을 다시 10진법으로 바꾸면 25라는 정수가 됩니다.
즉, 100 >> 2라는 연산의 결과는 25가 됩니다.
위 과정을 그대로 코드로 작성한 것이 바로 아래 코드입니다.
using System;
class MyProgram
{
public static void Main()
{
int test = 100;
String test_2 = Convert.ToString(test, 2);
Console.WriteLine(test.ToString() + " -> " + test_2);
int test_shifted = test >> 2;
String test_shifted_2 = Convert.ToString(test_shifted, 2);
Console.WriteLine(test_shifted.ToString() + " -> " + test_shifted_2);
}
}
-- Result
100 -> 1100100
25 -> 11001
위 코드를 보면 >> 시프트를 적용하기 전 숫자는 100인데 적용 후 숫자는 25입니다.
>> 시프트 연산을 적용시키면 이진수의 숫자들이 오른쪽으로 이동되며 이진수의 자리수가 적어집니다.
따라서 >> 시프트 연산의 결과는 이전 숫자보다 더 작은 숫자가 return됩니다.
이제 반대의 연산자인 <<를 봅시다.
만약 100 << 2 라고 적는다면 10진수 정수인 100을 2진법으로 나타낸 후 2진법으로 나타내진 숫자를 왼쪽으로 2칸씩 이동시키라는 의미입니다.
숫자 100을 2진법으로 나타내면 1100100 이것과 같습니다.
이동 전 -> 1100100
이동 후 -> 110010000
이동 전/후의 2진법은 위와 같습니다.
이동 전의 숫자를 왼쪽으로 2칸씩 이동시켰으니 오른쪽에 빈 공간이 생기고 따라서 빈 공간에 0이 채워집니다. (보라색 0 두개)
이동 후 만들어진 숫자는 110010000인데 이것을 다시 10진법으로 바꾸면 400이라는 정수가 됩니다.
즉, 100 << 2라는 연산의 결과는 400이 됩니다.
이것을 그대로 코드로 작성한 것이 바로 다음 코드입니다.
using System;
class MyProgram
{
public static void Main()
{
int test = 100;
String test_2 = Convert.ToString(test, 2);
Console.WriteLine(test.ToString() + " -> " + test_2);
int test_shifted = test << 2;
String test_shifted_2 = Convert.ToString(test_shifted, 2);
Console.WriteLine(test_shifted.ToString() + " -> " + test_shifted_2);
}
}
-- Result
100 -> 1100100
400 -> 110010000
위 코드를 보면 << 시프트를 적용하기 전 숫자는 100인데 적용 후 숫자는 400입니다.
<< 시프트 연산을 적용시키면 이진수의 숫자들이 왼쪽으로 이동되며 이진수의 자리수가 많아집니다.
따라서 << 시프트 연산의 결과는 이전 숫자보다 더 큰 숫자가 return됩니다.
<<, >> 연산자도 사칙연산과 동일한 취급을 받습니다.
따라서 저희가 a + b의 결과를 a에 대입하라는 식을 a = a + b 또는 a += b 라고 씁니다.
<<, >>도 마찬가지입니다.
a = a << b 는 a <<= b 와 동일한 식입니다.
a = a >> b 는 a >>= b 와 동일한 식입니다.
using System;
class MyProgram
{
public static void Main()
{
int test = 100;
test >>= 2;
Console.WriteLine(test);
int test2 = 100;
test2 <<= 2;
Console.WriteLine(test2);
}
}
-- Result
25
400
위에서 봤던 예시를 <<=, >>= 연산자를 이용한 결과입니다.