본문 바로가기
ETC/C#

데이터를 가공하는 연산자

by 빡구동동 2021. 1. 11.

데이터를 가공하는 연산자


널 조건부 연산자  - ?.

?. 가 하는 일은 객체의 멤버에 접근하기 전에 해당 객체가 null인지를 검사하여 그 결과가 참(즉, 객체가 null)이면 그 결과로 null을 반환하고, 그렇지 않으면 '.' 뒤에 지정된 멤버를 반환

ArrayList a = null;
a?.Add("야구");	// a?.이 null을 반환하므로 Add() 메소드는 호출되지 않음
a?.Add("축구");
Console.WriteLine($"Count : {a?.Count}");	// 아무 결과도 안나옴(null 상태)

a = new ArrayList();	// a는 더 이상 null이 아님
a?.Add("야구");
a?.Add("축구");
Console.WriteLine($"Count : {a?.Count}");	// Count = 2
Console.WriteLine($"{a?[0]}");

비트 연산자

연산자 이름 설명 지원 형식
<< 왼쪽 시프트 연산자 첫 번째 피연산자의 비트를 두 번째 피연산자의 수만큼 왼쪽으로 이동시킴 첫 번째 피연산자 
int, uint, long, ulong
두 번째 피연산자
int 형식만 지원
>> 오른쪽     "  <<와 반대 <<와 같음
& 논리곲(AND) 연산자 두 피연산자의 비트 논리곱 수행 정수 계열 형식, bool 형식
| 논리합(OR) 연산자 두 피연산자의 비트 논리합 수행 &와 같음
^ 배타적 논리합(XOR) 연산자 두 피연산자의 비트 배타적 논리합 수행
(서로 다르면 1)
&와 같음
~ 보수(NOT) 연산자 피연산자의 비트를 0은 1, 1은 0으로 반전시킴.
(보수 연산)
단항 연산자
int, uint, long, ulong

시프트 연산자

시프트 연산자(Shift Operator)는 비트를 왼쪽이나 오른쪽으로 이동시키는 기능

 

시프트 연산

단, 음수에 대한 오른쪽 시프트 연산은 약간 다른데 

비트를 이동시킨다는 것은 같지만, 이동시킨 후 만들어진 빈 자리에 0이 아닌 1을 채워 넣는다.

 

사용하는 이유

1) 시프트 연산은 고속의 곱셈과 나눗셈을 구현하기 쉬움

2) & , | 연산자와 함께 byte처럼 작은 단위로 쪼개진 데이터를 다시 하나의 int나 long 형식으로 재조립하는데 사용

 

int a = 1;
Console.WriteLine("a      : {0:D5} (0x{0:X8})", a);
Console.WriteLine("a << 1 : {0:D5} (0x{0:X8})", a<<1);
Console.WriteLine("a << 5 : {0:D5} (0x{0:X8})", a<<5);

int b = 255;
Console.WriteLine("b >> 1 : {0:D5} (0x{0:X8})", b >> 1);

int c = -255;
Console.WriteLine("b : {0:D5} (0x{0:X8})", c);

비트 논리 연산자

비트 논리 연산자는 bool 형식 외에도 정수 계열 형식의 피연산자에 대해서도 사용 가능

How?

우리가 사용하는 데이터는 0&1로 이뤄지는 비트 덩어리다. 

int 형식 데이터는 4바이트(32비트)로 이뤄지고, long 형식 데이터는 8바이트(64비트)로 이뤄진다.

 

비트 논리 연산은 이 비트 덩어리를 이루고 있는 각 비트에 대해 1은 참, 0은 거짓으로 해서 논리 연산을 수행.

 

int a = 9;
int b = 10;

Console.WriteLine($"{a} & {b} : {a & b}");
// 9 & 10 : 8

int c = 255;
Console.WriteLine("~{0}(0x{0:X8}) : {1}(0x{1:X8})", c, ~c);
// ~255(0x000000FF) : -256(0xFFFFFF00)

 

'ETC > C#' 카테고리의 다른 글

메소드 / 가변길이 매개 변수 / 로컬 함수  (0) 2021.01.20
매개 변수 / 참조 지역 변수  (0) 2021.01.18
C# 문자열 다루기  (0) 2021.01.10
C# 데이터 보관하기 (3)  (0) 2021.01.10
C# 데이터 보관하기 (2)  (0) 2021.01.09

댓글