Programming with JS: Bitwise Operations - Lee-hyuna/33-js-concepts-kr GitHub Wiki
์ด ์ผ๋ จ์ ๊ธฐ์ฌ์์๋ JavaScript์ prism๊ณผ ๋ค๋ฅธ ์ปดํจํฐ ๊ณผํ ์ฃผ์ ๋ฅผ ์ดํด๋ด ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ์๊ณ ์๊ณ ๋ง์ ๋ฐฐ์ด๋ค์ ์ ๋ ฌํ์ต๋๋ค. ๊ทผ๋ณธ์ ์ธ ๊ฐ๋ ์ ์์ง ์๋ ๊ฒ์ด ์ ์ผ ์ค์ํ ๊ฒ์ ๋๋ค.
๋นํธ๋ก ์๋ ค์ง 1๊ณผ 0 ์ค ๊ฐ์ฅ ๊ทผ๋ณธ์ ์ธ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋งค์ผ ์ฝ๋ฉ์ ํ ๋ ์ด ์์ ์ด ์ค์ํ์ง ์๋ค๊ณ ์๊ฐํด์์ง๋ง ๊ฒฐ๊ตญ์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋ ์์ ๊นจ๋ซ์ต๋๋ค.
๋นํธ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค๋ฉด ๋ ๋์ JavaScript ๊ฐ๋ฐ์๊ฐ ๋์ง ์์ต๋๋ค. ์์ ์ค์ธ React ์ฑ์๋ ๋์์ด ๋์ง ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ ๋์ ์ํํธ์จ์ด ๊ฐ๋ฐ์๊ฐ ๋ ์ ์์ต๋๋ค.
๋ชจ๋ ๊ฒ์ ์ ํ์๋ ์์ผ๋ฉฐ ์ฌ์ค ๊ทธ ๋ชจ๋ ๊ฒ์ ๊ธฐ์ตํ์ง ๋ชปํ ๊ฒ์ ๋๋ค. ์ด ๊ธ์์ ์ ์ ๋ชฉํ๋ ๋นํธ์ ๋นํธ ์กฐ์์ ๋ํด ์์์ผ ํ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ง์์ ๋ค๋ฃจ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ๋นํธ๊ฐ ๋ญ๋ฐ?
์ปดํจํฐ์์๋ ๋ชจ๋ ๊ฒ์ด 1์ด์ 0์ด๋ก ๋ด๋ ค๊ฐ๋๋ค. ์ซ์, ๋ฌธ์ ๋๋ ๋ฌธ์์ด๊ณผ ํจ๊ป ์๋ํ์ง ์์ผ๋ฉฐ ์ด์ง์(๋นํธ)๋ง ์ฌ์ฉํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ์ด์ง ํ์์ผ๋ก ์ ์ฅ๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์, ์ปดํจํฐ๋ UTF-8๊ณผ ๊ฐ์ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ฌ ์ ์ฅ๋ ๋นํธ ์กฐํฉ์ ๋ฌธ์, ์ซ์ ๋๋ ๋ค๋ฅธ ๊ธฐํธ(ELI5 ๋ฒ์ )์ ๋งตํํฉ๋๋ค.
๋นํธ๊ฐ ๋ง์ผ๋ฉด ์นํ์ด ๋ง์์ง๊ณ ๋ง์์๋ก ๋ํํ ์ ์๋ ๊ฒ๋ ๋ง์์ง๋๋ค. (๋ญ ์๋ฏธ์ธ์ง ๋ชจ๋ฅด๊ฒ ์)
์๋ฅผ ๋ค์ด 113๋ฒ์ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. JS์์ ์ด์ง ํ์์ ์ป๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Number(113).toString(2) // 1110001
์ด ์์๋ ์ผ๋ถ๋ถ์ ๋ถ๊ณผํฉ๋๋ค. ์ด์ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ๋ค์ ์ด๋ป๊ฒ ์กฐ์ํ ์ ์๋์ง ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ง์ ๋ธ๋ก๊ทธ์์ 16์ง์๋ฅผ ๊ฐ์ง ์์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ญ์ง์ ๋ฐ ์ด์ง์๋ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ ์ด๋ฉด์ ๋ ผ๋ฆฌ๋ ์ด๊ฒ์ด ๋ ์ง๊ด์ ์ผ๋ก ์ดํด๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์์ฌ์ค๋ฌ์ธ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ข ์ด์ ๋นํธ ๋ฐ ๋ชจ๋ ์์ ์ ๊ธฐ๋กํ๊ณ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ถ์ ํ ์ ์์ต๋๋ค.
๋ํ JavaScript์์ ์ง์ ์ด์ง์๋ฅผ ์ ๋ ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ด์ง์๋ฅผ ์ญ์ง์๋ก ๋ณํํ๋ ค๋ฉด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// function parseInt
parseInt(1111, 2) //15
& (AND)
์ผ๋ณ ํ๋ก๊ทธ๋๋ฐ ์์
์์ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ &&
๋
ผ๋ฆฌ ์ฐ์ฐ์์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ด ์ฐ์ฐ์๋ ๋น๊ต๋ ๋นํธ๊ฐ ๋ชจ๋ 1๊ณผ 0์ด๋ฉด ๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ์ 1์ ๋ฐํํฉ๋๋ค. ์์ชฝ์์ ์ซ์๋ฅผ ์ ํํ ๋ค์(์ด์ง ํ์์ด ์๋๋ผ ์ซ์) ๋นํธ๋ฅผ ํ๋์ฉ ๋น๊ตํฉ๋๋ค.
๊ทธ๊ฒ์ ์๊ฐํํด๋ณด์ฃ . ์ซ์ 12
์ 15
๋ 1100
๊ณผ 1111
์ ์ด์ง์๋ฅผ ๋ํ๋
๋๋ค. ๊ทธ ์ซ์์ &
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด๋ณด์ฃ . ๋ก๊ทธ์ ์ฐ์ด๋ณด๋ฉด 12๋ง ๊ฒฐ๊ณผ๋ก ๋์ถ์ด ๋ฉ๋๋ค. ๋ญ๊ฐ ์ด์ํ์ฃ ?
12
์ ๋ชจ๋ ๋นํธ๋ฅผ 15
์ ๋น๊ตํ๊ณ ์ด์๋ฐฉ์์ ๋ฐ๋ผ 1100
์ ๋ค์ ์ป์์ต๋๋ค. ๊ทธ๋์ 12
๊ฐ ๋์จ ๊ฒ ์
๋๋ค.
&
์ฐ์ฐ์๊ฐ ๊ฐ๊ณ ์๋ ์ฌ๋ฏธ์๋ ์์
์ค ํ๋๋ ์ซ์๊ฐ ์ง์์ธ์ง ํ์์ธ์ง ์์๋ด๋ ๊ฒ์
๋๋ค. ์ซ์๊ฐ ํ์์ด๋ฉด ์ฒซ ๋ฒ์งธ ๋นํธ๋ ํญ์ 1
์ด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ซ์๋ฅผ ์ฌ์ฉํ๊ณ 1
๊ณผ ๋น๊ตํ ์ ์์ผ๋ฏ๋ก ์ซ์๊ฐ ํ์์ด๋ฉด ๊ฒฐ๊ณผ๋ 1
์ด ๋ฉ๋๋ค. ํ์ง๋ง ์ค์ ์ฝ๋๋ฒ ์ด์ค์ ์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. ํ์ฌ ๋ฌด์์ ํ๊ณ ์๋์ง ๋ช
ํํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
| (OR)
์ด๊ฒ์ ||
๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ๋น๊ต๋ ์ด์ง์๊ฐ ๋ชจ๋ 0
์ผ ๋ ์ ์ด๋ 1
๊ณผ 0
์ด ์๋ ๊ฐ ๋น๊ต์ ๋ํด 1
์ ๋ฐํํ์ฌ ๋ ๊ฐ์ ์ด์ง์๋ฅผ ์ด์ง์ ๋ณ๋ก ๋น๊ตํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์์ ์๋ฅผ ๋ค์ด ์ด ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด 12 | 15
๊ฐ 15
๊ฐ ๋ฐํ๋ฉ๋๋ค. ์๊ทธ๋ด๊น์?
1100 | 1111
์ ๋ค์ 1111
๋๋ 15
์ ๋์ผํ ๊ฐ ๋น๊ต์ ๋ํด 1
์ ๋ฐํํฉ๋๋ค.
~ (NOT)
์ด ๊ฒ์ ์กฐ๊ธ ๋ ํ๋ช
ํ NOT
์
๋๋ค. ๊ฒฐ๊ณผ๋ 2์ ์นญ์ฐฌ ์ฐ์ ์์ e ์์์
๋๋ค. ์ฆ, 1์ด์์ 0์ด๋ก ๋ชจ๋ ๋นํธ๋ฅผ ๋๋๋ฆฌ๊ณ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
๊ทธ๋ฌ๋ ~15
๋ฅผ ๋ก๊ทธ์ ์ฐ๋๋ค๋ฉด ๋นํธ๊ฐ ์ฌ๋ฐ๋ฅด๋๋ผ๋ ๊ฒฐ๊ณผ๊ฐ -16
์ด ๋ฉ๋๋ค. ์ด๋ ๋ ๊ฐ์ ๋ณด์ ์ฐ์ ์์ ์ซ์์ ์์๋ฅผ ํ์ํ๋ ค๋ฉด ๋จผ์ ์ซ์์ ๋นํธ๋ฅผ ๋ฐ๊พผ ๋ค์ 1์ ์ถ๊ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
^ (XOR)
์ด ์ฐ์ฐ์๋ XOR ์ฐ์ฐ์ ๋๋ ๋
์ ์ ์ธ OR๋ก ์๋ ค์ ธ ์์ต๋๋ค. &
, |
์ฐ์ฐ์์ ๋์ผํ๊ฒ ๋น๊ต๋ฅผ ํ๋ ๋ฐฉ์์ ์ฐจ๋ณํํ๋ฉด์ ์์ชฝ์ ์ซ์๋ฅผ ์ทจํฉ๋๋ค.
ํด๋นํ๋ ๋นํธ๋ฅผ ๋น๊ตํ๊ณ 1๊ฐ๋ง ์์ ๋๋ง 1์ ๋ฐํํฉ๋๋ค. ์ด ๋นํธ์ ๊ฒฝ์ฐ ์ค๋ช
ํ๊ธฐ์ ๊ทธ๋ค์ง ์ข์ง ์์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ข ๋ ์๊ฐ์ ์ผ๋ก ์ค๋ช
ํ๋ ๊ฒ์ด ์ข๊ฒ ๊ตฐ์, 1 ^ 0
์ด 1
์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฌ๋ 1 ^ 1
์ 0
์ ๋ฐํํฉ๋๋ค.
^
์ฐ์ฐ์๋ 1
๊ณผ 0
์ ๋น๊ตํ๋ ํน์ ๊ฒฝ์ฐ์๋ง 1
์ ๋ฐํํฉ๋๋ค.
Shifting ์ฐ์ฐ์
์ด๋ ๋นํธ๋ฅผ ์ฒ๋ฆฌํ๋ >>
, <<
์ฐ์ฐ์๊ฐ ์์ต๋๋ค. ์ฌ๋ฌ๋ถ์ด ์ถ์ธกํ ์ ์๋ฏ์ด ์ฐจ์ด๋ ์ซ์์ ๋นํธ๋ฅผ ์ด๋ํ๋ ์์น์
๋๋ค.
<<
์ฐ์ฐ์๋ ์ซ์์ ๋ชจ๋ ๋นํธ๋ฅผ n
๋ฒ ๋ฐ๊ฟ๋๋ค. ์ฌ๊ธฐ์ ์ ์ํด์ผ ํ ๊ฒ์ ๋ฒํธ๋ฅผ ์ฎ๊ธธ ๋ ๋ฐ์ํ๋ ๋น ๊ณต๊ฐ์ ๋ชจ๋ 0
์ผ๋ก ์ฑ์์ ธ ์๋ค๋ ์ ์
๋๋ค.
๋ฐ๋ฉด์ >>
์ฐ์ฐ์๋ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํฉ๋๋ค. ์ด ๋ณํ ์ฐ์ฐ์์ ์ด์ ๋ณํ ์ฐ์ฐ์์ ์ฐจ์ด์ ์ ์ด ์ฐ์ฐ์๊ฐ ์์ ์ซ์์ ๋นํธ๋ฅผ 0์ด๋ก ์ฑ์ฐ๊ณ ์์ ์ซ์์ ๋นํธ๋ฅผ 1์ด๋ก ์ฑ์ฐ๋ ๊ฒ์
๋๋ค.
์ฌ๊ธฐ์ ์ง๊ณ ๋์ด๊ฐ์ผ ํ ๋ถ๋ถ์ด ์์ต๋๋ค. ๋ณดํต ์ซ์์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ ํ์ง๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. 1์ด๋ฉด ์์์ด๊ณ , 0์ด๋ฉด ์์์ ๋๋ค. ๋ฐ๋ผ์ ์ฐํ์ ์ด๋ฉด์ ์๋ ์ถ๋ก ์ ์ฐ๋ฆฌ๊ฐ ์์ง์ด๊ณ ์๋ ์ซ์์ ํ์์ ์งํค๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
๋นํธ์ฐ์ฐ์ ์์ฉํด๋ณด๊ธฐ
์ด์ ๋ฌด์์ ํ๋์ง ์๊ฒ ๋์์ผ๋ ๋นํธ๋ฅผ ์กฐ์ํ๋ ๋ฐ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์, ์ด์ ์์น๋ฅผ ์ฎ๊ธฐ๋๋ก ํฉ์๋ค. ์ค๋ฅธ์ชฝ์ ๋ ๋ฒ์งธ ๋นํธ๋ฅผ ์ค์ ํฉ๋๋ค(1
). ์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ masks ๊ฐ๋
์ ๊ฐ์ ธ๋ค ์ค๋๋ค. masks๋ ๋ฌ์ฑํ๋ ค๋ ํญ๋ชฉ์ ๋ฐ๋ผ 1
๋๋ 0
์ผ๋ก ์ค์ ํ ๋นํธ๋ง ์๋ ์ด์ง ํ์์ ์ซ์์
๋๋ค. ๋ํ ๋ณ๊ฒฝํ ๋นํธ๋ฅผ ์ ์ํ๋ ํ๋๊ทธ๋ก๋ ์ฌ์ฉ๋๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๋นํธ๋ฅผ ์ค์ ํ๋ ค๋ฉด ๋ง์คํฌ๊ฐ 0001
์ด ๋ฉ๋๋ค. ๋ ๋ฒ์งธ ์ค์ ์ ์ํ๋ ๊ฒฝ์ฐ 0010
๋ฑ์ด ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์ฌํญ์ ๋ณด๋ค ๋ช ํํ๊ฒ ํ ์ ์์ต๋๋ค.
const setBit = (num, position) => {
let mask = 1 << position
return num | mask
}
// Set the bit at position 1
setBit(12, 1) // return 14 -> 1110
์, ์ง๊ธ๊น์ง๋ ์ข์ต๋๋ค. ์ด๋ป๊ฒ ํ๋ฉด ์ข ๋ ์ ๋ฆฌํ ์ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. ๋นํธ๋ฅผ 0
์ผ๋ก ์ค์ ํด๋ณด๊ฒ ์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๋นํธ๋ ๊ทธ๋๋ก ์ ์งํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด์ ์์ฒ๋ผ ์ฝ์ง ์์ต๋๋ค.
const clearBit = (num, position) => {
// We use the ~/NOT operator after placing the bit
// We want 1s everywhere and 0 only where we want to modify
let mask = ~(1 << position)
// We use AND which will modify only the bits compared to 0
return num & mask
}
clearBit(15, 1) // 12 -> 1100
์ฌ๊ธฐ์ ๋ค๋ฅธ ์ ์ mask๊ฐ 1s๋ก ๊ฐ๋ ์ฐจ ์๊ณ ์ง์ฐ๋ ค๋ ์์น์์๋ง 0
์ ๊ฐ๊ธฐ๋ฅผ ์ํ๋ค๋ ์ ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ์ํ ์์น๋ง 0
์ผ๋ก ์ค์ ํ๋ &
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด์ ๋นํธ ์ค์ ๋ฐ ์ญ์ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ค์ง์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ฐ๋ฆฌ๋ ๊ทธ ๋นํธ๊ฐ ์ค์ ๋์๋์ง ์๋์ง ์ ์ ์์ง๋ง, ์ฐ๋ฆฌ๋ ์ ๋ง๋ก ๊ทธ๊ฒ์ ํ์ฌ ์ํ๋ฅผ ๋ฐ๊พธ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ด๊ฑด XOR์ ์ผ์ ๋๋ค.
const flipBit = (num, position) => {
let mask = 1 << position
// If the current state of the bit is 0, XOR will return 1
// If the bit is 1, XOR will set it to 0
return num ^ mask
}
flipBit(15, 1) // 13 -> 1101
์ด ๊ฒฝ์ฐ XOR๋ 1์ 1์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋นํธ์ ๊ฐ์ ๋ค์ง์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ๋ฉ๋๋ค.