1ν•™λ…„ (2023)/C μ–Έμ–΄

[C] Study : μˆ˜μ‹κ³Ό μ—°μ‚°μž - (5) λΉ„νŠΈ μ—°μ‚°μž

waterproof 2023. 8. 28. 13:47

 

 

 


λΉ„νŠΈ(bit): μ»΄ν“¨ν„°μ—μ„œ 정보λ₯Ό μ €μž₯ν•˜λŠ” κ°€μž₯ μž‘μ€ λ‹¨μœ„

 

2μ§„μˆ˜μ˜ ν•œμžλ¦¬μ— ν•΄λ‹Ήν•˜λ―€λ‘œ 0 λ˜λŠ” 1의 값을 κ°€μ§ˆ 수 μžˆλ‹€.

 

λΉ„νŠΈ 8κ°œκ°€ λͺ¨μ΄λ©΄ λ°”μ΄νŠΈ(byte)κ°€ λœλ‹€.

 

예λ₯Ό λ“€μ–΄μ„œ μ •μˆ˜ 10은 컴퓨터 μ•ˆμ—μ„œ λ‹€μŒκ³Ό 같은 32λΉ„νŠΈ νŒ¨ν„΄μœΌλ‘œ μ €μž₯λœλ‹€. μ •μˆ˜ 10을 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λ©΄ μ‰½κ²Œ μ•Œ 수 μžˆλ‹€.

 

0000 0000 0000 0000 0000 0000 0000 1010

 

μœ„μ˜ λΉ„νŠΈ νŒ¨ν„΄μ„ 16μ§„μˆ˜λ‘œ ν‘œμ‹œν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

0x000000A

 

이것을 μ‰½κ²Œ λ³€ν™˜ν•˜λ €λ©΄ μœˆλ„μš°μ˜ "ν”„λ‘œκ·Έλž˜λ¨Έμš©" 계산기λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

 

λΉ„νŠΈ μ—°μ‚°μžλŠ” λΉ„νŠΈλ³„λ‘œ AND μ—°μ‚°μ΄λ‚˜ OR 연산을 ν•˜λŠ” μ—°μ‚°μžμ΄λ‹€.

 

 

λΉ„νŠΈ μ—°μ‚°μžλŠ” μ •μˆ˜ νƒ€μž…μ˜ ν”Όμ—°μ‚°μžμ—λ§Œ μ μš©ν•  수 μžˆλ‹€.

 

즉, μ •μˆ˜ νƒ€μž…μ—λŠ” char, short, int, long 등이 μžˆλ‹€. μ •μˆ˜ νƒ€μž„μ΄λ©΄ signedλ‚˜ unsigned에 상관없이 λͺ¨λ‘ 적용 κ°€λŠ₯ν•˜λ‹€.

 

λΉ„νŠΈ μ—°μ‚°μžλŠ” λΆ€λ™μ†Œμˆ˜μ μˆ˜μ—λŠ” μ μš©ν•  수 μ—†λ‹€. μ΄λŠ” λ‹Ήμ—°ν•œ κ²ƒμœΌλ‘œ λΆ€λ™μ†Œμˆ˜μ μˆ˜λŠ” 컴퓨터 λ‚΄λΆ€μ—λŠ” μ •μˆ˜μ™€ λ‹€λ₯΄κ²Œ ν‘œν˜„λœλ‹€λŠ” 것을 전에 μ„€λͺ…ν•œ λ°” μžˆλ‹€.

 

λΉ„νŠΈ λ‹¨μœ„ μ—°μ‚°μžλŠ” μ‹œμŠ€ν…œκ³Ό μ»΄νŒŒμΌλŸ¬μ— λ”°λΌμ„œ μ•½κ°„μ”© λ‹¬λΌμ§ˆ 수 μžˆλ‹€. (λΉ„μ£Όμ–Ό μŠ€νŠœλ””μ˜€λ₯Ό κΈ°μ€€μœΌλ‘œ ν•œλ‹€.)

 

μ§€κΈˆλΆ€ν„° 각각의 λΉ„νŠΈ μ—°μ‚°μžλ₯Ό μžμ„Ένžˆ μ‚΄νŽ΄λ³Έλ‹€.

 

 

 

 

λΉ„νŠΈ AND, OR, XOR, NOT

 

 2개의 intν˜•μ— λŒ€ν•˜μ—¬ λΉ„νŠΈ AND 연산을 ν•œλ‹€κ³  ν•˜μž. 같은 μœ„μΉ˜μ˜ λΉ„νŠΈλ₯Ό λΉ„κ΅ν•˜μ—¬, ν•˜λ‚˜λΌλ„ 0이 있으면 κ²°κ³Ό λΉ„νŠΈλŠ” 0이 λœλ‹€.

 

 

 

 

μ΄λ²ˆμ—λŠ” λΉ„νŠΈ OR 연산을 ν•œλ‹€κ³  ν•˜μž. 같은 μœ„μΉ˜μ˜ λΉ„νŠΈλ₯Ό λΉ„κ΅ν•˜μ—¬, ν•˜λ‚˜λΌλ„ 1이 있으면 κ²°κ³Ό λΉ„νŠΈλŠ” 1이 λœλ‹€.

 

 

 

 

μ΄λ²ˆμ—λŠ” λΉ„νŠΈ XOR 연산을 ν•œλ‹€κ³  ν•˜μž. 같은 μœ„μΉ˜μ˜ λΉ„νŠΈλ“€μ΄ μΌμΉ˜ν•˜λ©΄ 0이 되고 λ‹€λ₯΄λ©΄ 1이 λœλ‹€.

 

 

 

 

λΉ„νŠΈ NOT 연산을 μƒκ°ν•΄λ³΄μž. λ³€μˆ˜ μ•ˆμ˜ 각 λΉ„νŠΈλ“€μ„ λ°˜μ „μ‹œν‚¨λ‹€. λΆ€ν˜Έλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΉ„νŠΈλ„ λ°˜μ „λœλ‹€.

 

 

 

 

 μœ„μ˜ μ„€λͺ…을 ν”„λ‘œκ·Έλž¨μœΌλ‘œ μž‘μ„±ν•˜μ—¬ ν™•μΈν•΄λ³΄μž.

 

#include <stdio.h>

int main(void)
{
	int x = 9; // 00001001 
	int y = 10; // 00001010

	printf("%08X & %08X = %08X\n", x, y, x & y);    // 00001000
	printf("%08X | %08X = %08X\n", x, y, x | y);    // 00001011
	printf("%08X ^ %08X = %08X\n", x, y, x ^ y);    // 00000011
	printf("~ %08X = %08X\n", x, ~x );              // 11110110

	return 0;
}

 

 

 

 

 

λΉ„νŠΈ 이동 μ—°μ‚°μž (<<, >>)

 

  λΉ„νŠΈ 이동(shift) μ—°μ‚°μžλŠ” μ§€μ •λœ 숫자만큼 전체 λΉ„νŠΈλ₯Ό μ΄λ™μ‹œν‚¨λ‹€. 

 

 μ΄λ™ν•  수 μžˆλŠ” λ°©ν–₯이 μ™Όμͺ½κ°€ 였λ₯Έμͺ½ 두 κ°œκ°€ μžˆμœΌλ―€λ‘œ 두 개의 μ—°μ‚°μž <<와 >>κ°€ ν•„μš”ν•˜λ‹€.

 

 

λ¨Όμ € μ™Όμͺ½ 이트 이동 μ—°μ‚°μžμΈ <<λŠ” μ§€μ •λœ 숫자만큼 μ™Όμͺ½μœΌλ‘œ μ΄λ™ν•œλ‹€.

 

이 λ•Œ λ³€μˆ˜μ˜ 경계λ₯Ό λ²—μ–΄λ‚˜λŠ” λΉ„νŠΈλ“€μ€ μ—†μ–΄μ§€κ²Œ 되고 였λ₯Έμͺ½μ— λ°œμƒν•˜λŠ” 빈 곡간은 0으둜 μ±„μ›Œμ§€κ²Œ λœλ‹€.

 

예λ₯Ό λ“€μ–΄μ„œ 15<<2λ₯Ό μƒκ°ν•˜μ—¬ 보자.

 

λΉ„νŠΈ 이동 μ—°μ‚°μž

 

 

λΉ„νŠΈλ“€μ„ μ™Όμͺ½μœΌλ‘œ ν•œ 번 이동할 λ•Œλ§ˆλ‹€ 값은 두 λ°°κ°€ λœλ‹€. 이 νŠΉμ„±μ„ μ΄μš©ν•  수 μ—†μ„κΉŒ?

 

κ°œλ°œμžλ“€μ€ μ˜ˆμ „λΆ€ν„° λΉ„νŠΈ 연산을 μ΄μš©ν•˜μ—¬ λΉ λ₯΄κ²Œ 2배둜 λ§Œλ“œλŠ” 방법듀을 μ‚¬μš©ν•˜μ—¬ μ™”λ‹€.

 

 

 

였λ₯Έμͺ½ λΉ„νŠΈ 이동 μ—°μ‚°μžμΈ >> λŠ” μ§€μ •λœ 숫자만큼 λΉ„νŠΈλ“€μ„ 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•œλ‹€.

 

μ΄λ•Œμ—λ„ λ³€μˆ˜μ˜ 경계λ₯Ό λ²—μ–΄λ‚˜λŠ” λΉ„νŠΈλ“€μ€ μ—†μ–΄μ§€κ²Œ 되고 μ™Όμͺ½μ— λ°œμƒν•˜λŠ” 빈 곡간은 λΆ€ν˜Έ λΉ„νŠΈλ‘œ μ±„μ›Œμ§€κ²Œ λœλ‹€.

 

μ—¬κΈ°μ„œ μ£Όμ˜ν•  점은 μ™Όμͺ½μ˜ λ°œμƒν•˜λŠ” 빈 곡간을 λ¬΄μž‘μ • 0으둜 μ±„μš°λ©΄ μ•ˆ 되고 λΆ€ν˜Έ λΉ„νŠΈλ‘œ μ±„μ›Œμ•Ό ν•œλ‹€λŠ” 점이닀.

 

μ–‘μˆ˜λ©΄ λΆ€ν˜ΈλΉ„νŠΈκ°€ 0μ΄λ―€λ‘œ 0으둜 μ±„μš°λ©΄ 되고, 음수라면 λΆ€ν˜Έ λΉ„νŠΈκ°€ 1μ΄λ―€λ‘œ 1둜 μ±„μ›Œμ•Ό ν•œλ‹€.

 

λ§Œμ•½ λΆ€ν˜Έ λΉ„νŠΈλ‘œ μ±„μš°μ§€ μ•ŠμœΌλ©΄ 이동 연산이 λλ‚œ 뒀에 μŒμˆ˜κ°€ μ–‘μˆ˜λ‘œ λ³€ν•  μˆ˜λ„ 있기 λ•Œλ¬Έμ΄λ‹€.

 

 

 

15 >> 2 와 같이 μ–‘μˆ˜λ₯Ό λΉ„νŠΈ μ΄λ™ν•˜λŠ” 경우λ₯Ό μ‚΄νŽ΄λ³΄μž.

 

μ–‘μˆ˜μ˜ λΉ„νŠΈ 이동

 

 

 

μ •μˆ˜ 9λ₯Ό μ™Όμͺ½κ³Ό 였λ₯Έμͺ½μœΌλ‘œ 1λΉ„νŠΈμ”© μ΄λ™μ‹œμΌœμ„œ κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μ‚΄νŽ΄λ³΄μž.

 

2배둜 λ˜κ±°λ‚˜ 1/2배둜 된 것을 ν™•μΈν•΄λ³΄μž.

 

#include <stdio.h>

int main(void)
{
	int x = 9;    // 1001 

	printf("%d << 1 = %d\n", x, x << 1);    // 10010
	printf("%d >> 1 = %d\n", x, x >> 1);    // 00100

	return 0;
}