πŸ“μ»΄ν“¨ν„°μ˜ μŒμˆ˜ν‘œν˜„ - 2의 보수, indexOf λ₯Ό ν†΅ν•œ 진리값 λ°˜ν™˜

10_2pangΒ·2023λ…„ 6μ›” 5일
0

βš½οΈνŠΈλŸ¬λΈ”μŠˆνŒ…

λͺ©λ‘ 보기
19/94
post-thumbnail

πŸ‘¨β€πŸ’»Β μ‚¬κ±΄


  • μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό ν‘ΈλŠ”μ€‘μ΄μ—ˆλ‹€. λ‚˜λŠ” μ•„λ¬΄λŸ° 생각없이 indexOf λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ if 문에 true ν˜Ήμ€ falseλ₯Ό λ°˜ν™˜λ°›κ³  μžˆμ—ˆλ‹€. κ·ΈλŸ¬λ‹€ 문득 원인을 κΆκΈˆν•΄ν–ˆκ³ , 그에 λŒ€ν•΄ 인터넷 μ„œμΉ­μ„ ν•˜μ—¬ ν•΄κ²°ν–ˆλ‹€.

βœ…Β ν•΄κ²°


일단 λ¨Όμ €, indexOf λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ 진리값을 λ°˜ν™˜ν•˜λŠ” 것은 β€˜~’ 을 ν™œμš©ν•œκ²ƒμ΄λ‹€. 예λ₯Ό λ“€μ–΄,

const arr = [1,2,3,4,5];
	if(!~arr.indexOf(6)){ // '~' 둜 μΈν•˜μ—¬, ~arr.indexOf(6) 은 -1이 μ•„λ‹Œ,0이 λ©λ‹ˆλ‹€.(false) μ—¬κΈ°μ„œ !λ₯Ό λΆ™μ—¬, true κ°€ λ˜λŠ” 것 μž…λ‹ˆλ‹€.
	return console.log("μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.");
}

λ₯Ό ν™œμš©ν•˜μ—¬, μ§„λ¦¬κ°’μœΌλ‘œ λ³€ν™˜ ν•˜μ—¬ 쑰건문을 ν™œμš©ν•˜λŠ” 것이닀.

μ—¬κΈ°μ„œ -1 의 값은 보수(~) λ₯Ό μ·¨ν•˜λ©΄, 0이 λ‚˜μ˜€λŠ” 것을 μ•Œμˆ˜μžˆλŠ”λ°, μ΄λ•Œ λ³΄μˆ˜λž€ 무엇인지 κΆκΈˆν•˜μ—¬ 이 λ˜ν•œ μ°Ύμ•„ λ³΄μ•˜λ‹€.

~ λŠ” λΉ„νŠΈλ‹¨μœ„μ˜ NOT μ—°μ‚°μžκΈ° λ•Œλ¬Έμ—, -1 을 λΉ„νŠΈλ‘œ λ³€ν™˜ ν•  λ•Œμ—λŠ” 2의 보수 λ₯Ό μ·¨ν•΄μ„œ 1111 이 되기 λ•Œλ¬Έμ— 이거의 NOT 연산을 μ·¨ν•΄μ£Όλ‹ˆκΉŒ 0000이 λ˜μ„œ 0이 λœλ‹€. κ²°κ΅­ 0이 falsy κ°’ μ΄λ‹ˆκΉŒ !을 뢙이면 true κ°€ λœλ‹€.

μ»΄ν“¨ν„°λŠ” 1 κ³Ό 0으둜 이루어진 2μ§„μˆ˜λ‘œ 이루어져 μžˆλ‹€. μ΄λŸ¬ν•œ 2μ§„μˆ˜μ˜ ν‘œν˜„μ€ 음수λ₯Ό ν‘œν˜„ν•  수 μ—†λŠ” λ‹¨μ μ΄μžˆλ‹€.

κ·Έλž˜μ„œ κ°€μž₯ μ΅œμƒμœ„ λΉ„νŠΈ(MSB) 에 1을 μ£Όμ–΄, 음수둜 ν‘œν˜„μ„ ν•œλ‹€. μ΄λŸ¬ν•˜κ²Œ κ·Έμ € μ΅œμƒμœ„ 단에 음수λ₯Ό μ£Όμ–΄ 연산을 ν•˜λŠ”κ²ƒμ€ μ‚¬λžŒλ“€μ΄ ν•˜κΈ°μ—λŠ” μ‰¬μ›Œλ³΄μ΄μ§€λ§Œ, μ»΄ν“¨ν„°λ‘œ 연산을 μž‘μš© ν•  λ•Œμ—λŠ” μ ˆλŒ€κ°’κ³Ό μ—°μ‚°ν•˜λŠ” 두 값을 λΉ„κ΅ν•˜λŠ” μž‘μš©λ„ κ±°μ³μ•Όν•˜κΈ° λ•Œλ¬Έμ— λ§Žμ€ 과정을 κ±°μ³μ•Όν•œλ‹€. 이λ₯Ό λ³΄μ™„ν•˜κΈ° μœ„μ— λ‚˜μ˜¨κ²ƒμ΄ λ°”λ‘œ 2의 보수 이닀.

보수λ₯Ό λ¨Όμ € μ„€λͺ…ν•˜μžλ©΄, λ³΄μˆ˜λŠ” λ°”λ‘œ λ³΄μΆ©ν•˜λŠ” 수 이닀.
μ΄λŸ¬ν•œ λ³΄μΆ©ν•˜λŠ” 수(1의 보수)의 μŒμˆ˜μ— -1 을 ν•œκ²ƒμ΄ λ°”λ‘œ 2의 보수 이닀. 1의 λ³΄μˆ˜μ—λŠ” 0(0000)κ³Ό -0(1111)이 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 이λ₯Ό λ³΄μ™„ν•˜κ³ μž λ§Œλ“ κ²ƒμ΄ 1의 λ³΄μˆ˜μ€‘ μŒμˆ˜μ—μ„œ -1을 ν•œ 값을 집어넣은 것 이라고 μƒκ°ν•˜λ©΄ λœλ‹€.

예λ₯Ό λ“€μ–΄ μ„€λͺ…을 ν•˜κ² λ‹€.

πŸ‘‰ 20 의 μ΄μ§„μˆ˜ = 0001 0100 20 의 μ΄μ§„μˆ˜λ₯Ό λΉ„νŠΈ λ°˜μ „ ν˜Ήμ€ -20 (1의 보수) β‡’ 1110 1011 여기에 μš°λ¦¬λŠ” 2의 보수λ₯Ό ν•΄μ£Όμ—ˆμ„λ•ŒλŠ”, 1의 λ³΄μˆ˜κ°€ 음수일 κ²½μš°μ—μ„œ -1 을 ν•΄μ£Όμ—ˆμœΌλ‹ˆ, λ‹€μ‹œ +1을 ν•΄μ€€λ‹€. β‡’ 1(MSB) 1110 1100

μ„€λͺ…을 ν•œ 것을 보고 있으면 μ–΄μ§€λŸ½μ§€λ§Œ, κ°„λ‹¨ν•˜κ²Œ κ²°κ³ΌλΆ€ν„° λ§ν•˜κ³ μžν•œλ‹€. 2의 보수λ₯Ό κ΅¬ν• κ²½μš°, 10μ§„μˆ˜μ˜ 수λ₯Ό λΉ„νŠΈ λ°˜μ „μ„ ν•œκ²ƒμ— +1 을 ν•˜λ©΄ 끝이닀.

μ΄μ œλŠ” ν•œλ²ˆ 이것을 연산에 λŒ€μž…ν•˜μ—¬ 보자.

πŸ‘‰ -20 = 1(MSB) 1110 1100 +21 = 0001 0101 β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€” 1(캐리) 0(MSB)0000 0001 β‡’ MSB κ°€ 0이기 λ•Œλ¬Έμ— μ–‘μˆ˜μ΄λ©°, κ·Έ λ’€μ˜ 8개의 λΉ„νŠΈλ₯Ό κ³„μ‚°ν•˜λ©΄ 1 μ΄λ‚˜μ˜¨λ‹€. 이λ₯Ό 톡해, μ—°μ‚°λœ 값은 +1 μ΄λΌλŠ” 것을 μ•Œ 수 μžˆλ‹€.

πŸ’­Β κ°œμ„ 


μ‰½κ²Œ 놓칠 수 μžˆλŠ” 뢀뢄을 쑰금 더 μžμ„Ένžˆ μ•Œμ•„λ³΄κ³  μ•Œμ•„λ‚˜κ°€λŠ” 것에 μžˆμ–΄, 재미λ₯Ό λŠλΌλŠ” 만큼 μ•žμœΌλ‘œλ„ 천천히 μ‘°κΈˆμ”© λ‚˜μ•„κ°€μ•Ό ν•œλ‹€.

profile
μ£Όλ‹ˆμ–΄ ν”„λ‘ νŠΈμ—”λ“œ 개발자 이광렬 μž…λ‹ˆλ‹€ 🌸

0개의 λŒ“κΈ€