์๋ ํ์ธ์ Foma ๐ป ์ ๋๋ค!
์ค๋์ ์ฐ์ฐํ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ๋ค๊ฐ '^=' ์ ๊ฐ์ ์ฐ์ฐ์๋ฅผ ๋ฐ๊ฒฌํ๋๋ฐ, ์ ํํ ์ด๋ค๊ฑด์ง ๋ชจ๋ฅด๊ฒ ๋๋ผ๊ตฌ์.
์ฐพ์๋ณด๋ ํด๋น ์ฐ์ฐ์๋ Swift์์ ๊ณ ๊ธ ์ฐ์ฐ์๋ก ๋ถ๋ฅํด ๋์๋๋ผ๊ตฌ์.
๊ทธ๋์ ์ค๋์ Swift์ ๊ณ ๊ธ ์ฐ์ฐ์์ ๋ํด์ ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~!
UInt
์ฐ์ ๋ค์ด๊ฐ๊ธฐ ์ ์ UInt์ ๋ํ ์ดํด๊ฐ ํ์ํด์.
์๋ Int๋ ์ ์ ์ฆ, ์์์ ์์๋ฅผ ๋ชจ๋ ๊ฐ์ง ์ ์์์ฃ ?
UInt๋ ์ด ์ค์์ ์์๋ง ๊ฐ์ง ์ ์์ต๋๋ค. (์์๋ฅผ ๋ฃ์ผ๋ฉด ์ปดํ์ผ ์๋ฌ ๋ฐ์)
๋ฒ์๋ก ๋ณด๋ฉด Int8 = -128...127 ์ด๊ณ , UInt8 = 0...256,
Int16 = -322768...322767์ด๊ณ UInt16 = 0...65535 ์ ๋๋ค.
์ ์ํ ๋ณ์์ ๋นํธ๊ฐ ์ ๋ ฅํ๋ ๋ฒ
๋ณดํต ์ ์ํ ๋ณ์์ ๊ฐ์ ์ค์ ํ ๋ ์๋์ ๊ฐ์ด ์ ์๋ฅผ ๋ฃ์์์?
var number:Int = 4
ํ์ง๋ง ๋นํธ๊ฐ์ ๋ฃ์ด๋ ๊ฐ์ ์ค์ ํ ์ ์๋๋ฐ์.
๋ฐฉ๋ฒ์ ์์ 0b๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ๋นํธ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
์๋์ ๊ฐ์ด 4์ 2์ง์๋ 100 ์ด๋ฏ๋ก 0b100์ผ๋ก ์ค์ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค
var binaryNum:Int8 = 0b100
print(binaryNum) //4
๋นํธ ์ฐ์ฐ์ NOT (Bitwise NOT Operator)
๋นํธ๊ฐ(2์ง์)๋ฅผ ๋ฐ๋๋ก ๋ฐ๊ฟ์ค๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. (0์ 1์ผ๋ก 1์ 0์ผ๋ก)
๊ธฐํธ๋ '~'๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
ex) ~00001111 -> 11110000
let binaryNum:UInt8 = 0b00001111
let notBinaryNum:UInt8 = ~binaryNum //11110000
print(binaryNum,notBinaryNum) //15 240
UInt๊ฐ ์๋ Int๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ x = (-x)-1์ ๊ณต์์ผ๋ก ๋ณํ๋๋ค.
var number = 4
print(~number) //-5 (-4)-1
๋นํธ ์ฐ์ฐ์ AND (Bitwise AND Operator)
๋ ๋นํธ๊ฐ์ ์๋ก ๋น๊ตํด ๊ฐ๋ค๋ฉด 1 ์๋๋ฉด 0์ผ๋ก ๋ฐ๊ฟ์ค๋๋ค.
๊ธฐํธ๋ '&' ๋ฅผ ์ฌ์ฉํด ์ค๋๋ค.
ex) 11111100 & 00111100 -> 00111111
let binaryNum1: UInt8 = 0b11111100
let binaryNum2: UInt8 = 0b00111111
let addBinaryByAndOperator = binaryNum1 & binaryNum2
print(addBinaryByAndOperator) //60 00111100
๋นํธ ์ฐ์ฐ์ OR (Bitwise OR Operator)
๋ ๋นํธ๊ฐ์ ๋น๊ตํด ํ๋๋ผ๋ 1์ด๋ฉด 1์ด ๋๊ณ ๋ ๋ค 0์ผ ๋ 0์ผ๋ก ๋ฐ๊ฟ์ค๋๋ค.
๊ธฐํธ๋ '|' ๋ฅผ ์ฌ์ฉํด ์ค๋๋ค.
ex) 10110010 | 11111110 -> 0101110
let binaryNum1: UInt8 = 0b10110010
let binaryNum2: UInt8 = 0b01011110
let addBinaryByOrOperator = binaryNum1 | binaryNum2
print(addBinaryByOrOperator) //254 01011110
๋นํธ ์ฐ์ฐ์ XOR (Bitwise XOR Operator)
๋ ๋นํธ๊ฐ์ ๋น๊ตํด ๋ ๋นํธ๊ฐ ๋ค๋ฅด๋ฉด 1 ๊ฐ์ผ๋ฉด 0์ด ๋ฉ๋๋ค.
ex) 00010100 ^ 00010001 -> 00000101
์์(UInt)์ ์ํํ (Shifting Behavior for Unsigned Integers)
์ํ๋ ๋งํผ ์ผ์ชฝ์ด๋ ์ค๋ฅธ์ชฝ์ผ๋ก ๋นํธ๊ฐ์ ์ด๋ํ๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
๋จ, ์ค๋ฅธ์ชฝ์ด๋ ์ผ์ชฝ์ผ๋ก ๋ฒ์๊ฐ ๋์ด๊ฐ๋ฉด 0์ผ๋ก ๋์ฒด๋ฉ๋๋ค.
๊ธฐํธ๋ ์ผ์ชฝ์ผ๋ก ์ด๋ํ ๋ '<<' ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ ๋ '>>' ์ ์ฌ์ฉํฉ๋๋ค.
ex) 11111111 << 1 -> 11111110, 11111111 >> 1 -> 01111111
let binaryNum: UInt8 = 0b00000100
print(binaryNum << 1)// 8 00001000
print(binaryNum << 2)// 16 00010000
print(binaryNum << 5)// 128 10000000
print(binaryNum << 6)// 0 00000000
print(binaryNum >> 2)// 1 00000001
์ ์์ ๋นํธ๊ฐ
์ ์ํ์ผ๋ก ์ ์ธํ๊ฒ ๋๋ฉด ์์๋ฅผ ํฌํจํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์์ ๋นํธ๊ฐ๊ณผ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ๋ฐ๋๋ค.
๋งจ ์์๋ฆฌ๊ฐ 0์ด๋ผ๋ฉด ์์๋ฅผ ๋ปํ๊ณ 1์ด๋ผ๋ฉด ์์๋ฅผ ๋ปํ๋ฉฐ 1์๋ฆฌ๊ฐ ์ค๊ฒ ๋๋ค.
์๋ฅผ ๋ค์ด 00000100์ด ์๋ค๋ฉด ๋งจ ์์๋ฆฌ๊ฐ 1์ด๋ฏ๋ก ์ผ๋ฌด๋ฅผ ๋ปํ๊ณ ์ค์ ๊ฐ์ ๋งจ ์์๋ฆฌ๋ฅผ ๋บ 0000100์ด ๋๋ค.
๊ทธ๋ ๋ค๋ฉด 10000100์ ๋งจ ์์๋ฆฌ๊ฐ 1์ด๋ฏ๋ก ์์์ด๊ณ 0000100์ 4์ด๊ธฐ ๋๋ฌธ์ -4๋ฅผ ์๋ฏธํ๋ ๊ฒ์ผ๊น?
1์ผ ๋๋ ์์์ธ ๊ฒ์ ํํํ๋ ๊ฑด ๋ง์ง๋ง ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ด ์กฐ๊ธ ๋ค๋ฅด๋ค.
์๋์ ๊ฐ์ด 11111100์ด -4๋ฅผ ๋ปํ๊ฒ ๋๋ค.
๋งจ ์์๋ฆฌ๋ฅผ ๋นผ๋ฉด 1111100์ด ๋๊ณ ์ด๊ฒ์ 124๋ฅผ ๋ปํ๋๋ฐ ์ -124๊ฐ ์๋ -4์ผ๊น?
๊ทธ ์ด์ ๋ ์์์ผ ๋ ๋นํธ๊ฐ์์ ์๋ฆฟ์๋งํผ 2์ ์ ๊ณฑ์ ๊ฐ์ ๋บ ๊ฐ์ด ํด๋น ๊ฐ์ด ๋๋ค.
์์ 11111100์์ ๋งจ ์์๋ฆฌ๋ ์์์ ์์๋ฅผ ํํํ๋ฏ๋ก ์ ์ธํ๋ค.
๊ทธ๋ผ 1111100์ผ๋ก 124๊ฐ ๋๊ณ , ์ด๊ฒ์ 7์๋ฆฌ์ด๋ฏ๋ก 2^7 = 128์ด ๋๋ค.
์ฆ, 124์์ 128์ ๋บ ๊ฐ์ธ -4๊ฐ ๋๋ ๊ฒ์ด๋ค.
์ ์(Int)์ ์ํํ (Shifting Behavior for Unsigned Integers)
์์์ธ์ง ์ ์์ธ์ง๋ฅผ ๋ปํ๋ ๋งจ ์ฒซ๋ฒ์งธ๊ฐ์ด ์ ์ง๋๊ณ ์ค๋ฅธ์ชฝ์ด๋ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค.
let binaryNum: Int8 = 0b00000100
print(binaryNum << 1)// 8 00001000
print(binaryNum << 2)// 16 00010000
print(binaryNum << 5)// -128 <= 0-128 10000000
print(binaryNum << 6)// 0 00000000
print(binaryNum >> 2)// 1 00000001
์ค๋ฒํ๋ก์ฐ ์ฐ์ฐ์ (Overflow Operators)
์๋์ ๊ฐ์ด ๋ฒ์๋ฅผ ๋์ด์๊ฒ ๋๋ฉด overflow ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์๋ฌ๊ฐ ์๊ธฐ์ง ์๊ณ ๊ทธ๋ฅ ์ํ์ ํ๊ฒ ํ๋ฉด ์๋ ๊น?
๊ทธ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ์ค๋ฒํ๋ก์ฐ ์ฐ์ฐ์์ธ '&'์ ์ฐ๋ ๊ฒ์ด๋ค.
์ฆ, ์ต๋๊ฐ์ด ๋์ด์๊ฒ ๋๋ฉด ์ต์๊ฐ์ ์ด์ด์ ์ถ๊ฐ๊ฐ ๋๊ณ ์ต์๊ฐ๋ณด๋ค ๋ ์์์ง๋ฉด ์ต๋๊ฐ์ ์ด์ด์ ๋นผ๋ ๊ฒ์ด๋ค.
Int8์ ๋ฒ์๋ -128...127์ด๋ค.
์ต๋๊ฐ์ธ 127์ ์ค๋ฒํ๋ก์ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ +1์ ํ๊ฒ ๋๋ฉด ์ต์๊ฐ์ธ -128์ด ๋๊ณ
var number:Int8 = 127
number &+= 1
print(number) //-128
์ต์๊ฐ์ธ -128์ ์ค๋ฒํ๋ก์ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ -1์ ํ๊ฒ ๋๋ฉด ์ต๋๊ฐ์ธ 127์ด ๋๋ค.
์ค๋์ ์ด๋ ๊ฒ Swift์ ๊ณ ๊ธ ์ฐ์ฐ์๋ฅผ ์์๋ณด์๋๋ฐ์.
๋นํธ์์ด์ฆ ์ฐ์ฐ์๋ฅผ ์ด์ฉํ๋ฉด ๊ธฐ์กด์ ์๊ณ ๋ฆฌ์ฆ์ ํด๊ฒฐํ ๋ ๊ณต๊ฐ ๋ณต์ก๋๋ ์๊ฐ ๋ณต์ก๋ ์ธก๋ฉด์์ ๊ฝค ํจ์จ์ ์ผ๋ก ์ฌ์ฉ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๊ณ ,
์ค๋ฒํ๋ก์ฐ ์ฐ์ฐ์๋ ์ปดํ์ผ ์๋ฌ๋ฅผ ํด๊ฒฐํ๋๋ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ๊ฒ ๊ฐ์ต๋๋ค.
ํน์๋ผ๋ ํ๋ฆฐ ์ ์ด๋ ๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
Reference
https://jusung.gitbook.io/the-swift-language-guide/language-guide/26-advanced-operators
'๐ Language > Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] ๋น๋๊ธฐ ์ฒ๋ฆฌํ๋ ๋ฒ ์์๋ณด๊ธฐ(Callback,Promise,Async & Await) (0) | 2022.02.15 |
---|---|
[JS] Static,Protected,Private์ ๋ํด ์์๋ณด๊ธฐ (0) | 2022.02.15 |
[JS] ํด๋์ค(Class) ๊ธฐ๋ณธ ๋ฌธ๋ฒ๊ณผ ์์ (0) | 2022.02.12 |
[JS] ํ๋กํ ํ์ (Prototype) ๋ค๋ค๋ณด๊ธฐ (0) | 2022.02.12 |
[JS] ํ๋กํผํฐ ์ต์ (ํ๋๊ทธ) ๋ค๋ฃจ๊ธฐ(Property Flag) (0) | 2022.02.12 |
๋๊ธ