https://github.com/golang/go/issues/17373 ๋ฐ https://github.com/golang/go/issues/10757์ ์ด์ ํ ๋ก
์ด ์ ์์ ์ ์ ๋นํธ ํธ์๋ค๋ง์ ์ํ API ์ธํธ๋ฅผ ์๊ฐํฉ๋๋ค.
์ด ์ ์์ ์ ์ ๋นํธ twiddling์ ์ํ API ์ธํธ๋ฅผ ์๊ฐํฉ๋๋ค. ์ด ์ ์์ ์ํด ์ฐ๋ฆฌ๋ ๋ค์ ๊ธฐ๋ฅ์ ๊ด์ฌ์ด ์์ต๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ ์ค๋ฌธ ์กฐ์ฌ๋ฅผ ํตํด ์ ํ๋์์ต๋๋ค.
๋ค๋ฅธ ํธ์๋ค๋ง ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ด ๋ค ๊ฐ์ง ๊ธฐ๋ฅ์ผ๋ก ์ ํํ์ต๋๋ค.
ํธ๋ฆญ์ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๊ธฐ๊ฐ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
๋๋ ์ด๋ฏธ ์ฌ์ฉ ๊ฐ๋ฅํ Go ๊ตฌ์ฑ.
์ ํ๋ twiddleling ํจ์์ ํ์ ์งํฉ์ ๋ํ ๊ตฌํ์ ์ฐพ์์ต๋๋ค.
๋ฐํ์, ์ปดํ์ผ๋ฌ ๋ฐ ๋๊ตฌ๋ฅผ ํฌํจํ ๋ง์ ํจํค์ง์์:
| ํจํค์ง | CLZ | ์จ์ธ | ํ์ฝํฐ | ๊ตํ |
| --- | --- | --- | --- | --- |
| ์ํ/ํฐ | ์์ค | ์์ค | | |
| ๋ฐํ์/๋ด๋ถ/์์คํ
| ์์ค | ์์ค | | ์์ค |
| ๋๊ตฌ/์ปจํ
์ด๋/์งํฉ | ์์ค | | ์์ค | |
| cmd/์ปดํ์ผ/๋ด๋ถ/ssa | ์์ค | | ์์ค | |
| code.google.com/p/intmath | ์์ค | ์์ค | | |
| github.com/hideo55/go-popcount | | | X(asm) | |
| github.com/RoaringBitmap/roaring | | ์์ค | X(asm) | |
| github.com/tHinqa/bitset | ์์ค | ์์ค | ์์ค | |
| github.com/willf/bitset | ์์ค | | X(ASM) | |
| gopl.io/ch2/popcount | | | ์์ค | |
| GCC ๋ด์ฅ | ์์ค | ์์ค | ์์ค | ์์ค |
๋ค๋ฅธ ๋ง์ ํจํค์ง๋ ๋ค์ ๊ธฐ๋ฅ์ ํ์ ์งํฉ์ ๊ตฌํํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ํ๋์จ์ด ์ ๊ณต์
์ฒด๋ ์ค์์ฑ์ ์ธ์ํ์ต๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ ๋ฐ ํฌํจ๋ ๊ธฐ๊ณ ์์ค ์ง์.
ํ๋์จ์ด ์ง์ ์์ด ์ด๋ฌํ ์์
์ ๋งค์ฐ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค.
| ์์น | CLZ | ์จ์ธ | ํ์ฝํฐ | ๊ตํ |
| --- | --- | --- | --- | --- |
| AMD64 | ์์ค | ์์ค | ์์ค | ์์ค |
| ํ | ์์ค | ์์ค | ? | ์์ค|
| ARM64 | ์์ค | ์์ค | ? | ์์ค|
| S390X | ์์ค | ์์ค | ? | ์์ค|
popcnt๋ฅผ ์ ์ธํ ๋ชจ๋ ๋นํธ ํธ์๋ค๋ง ๊ธฐ๋ฅ์ ์ด๋ฏธ ๋ฐํ์/๋ด๋ถ/์์คํ ์ ์ํด ๊ตฌํ๋์์ผ๋ฉฐ "์ต๊ณ ์ ์ฑ๋ฅ์ ์ป์ ์ ์๋๋ก" ์ปดํ์ผ๋ฌ๋ก๋ถํฐ ํน๋ณํ ์ง์ ์ ๋ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ปดํ์ผ๋ฌ ์ง์์ ๋ฐํ์ ํจํค์ง๋ก ์ ํ๋๋ฉฐ ๋ค๋ฅธ Golang ์ฌ์ฉ์๋ ์ด๋ฌํ ํจ์์ ๋๋ฆฐ ๋ณํ์ ๋ค์ ๊ตฌํํด์ผ ํฉ๋๋ค.
clz, ctz, popcnt ๋ฐ bswap ๊ธฐ๋ฅ์ ์ปดํ์ผ๋ฌ/ํ๋์จ์ด ์ต์ ํ ๊ตฌํ์ ์ ๊ณตํ๊ธฐ ์ํด ๋ค์ ์ธ๋ถ API์ ํจ๊ป ์๋ก์ด ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ math/bits
๋ฅผ ์๊ฐํฉ๋๋ค.
package bits
// SwapBytes16 reverses the order of bytes in a 16-bit integer.
func SwapBytes16(uint16) uint16
// SwapBytes32 reverses the order of bytes in a 32-bit integer.
func SwapBytes32(uint32) uint32
// SwapBytes64 reverses the order of bytes in a 64-bit integer.
func SwapBytes64(uint64) uint64
// TrailingZeros32 counts the number of trailing zeros in a 32-bit integer, and if all are zero, then 32.
func TrailingZeros32(uint32) uint
// TrailingZeros64 counts the number of trailing zeros in a 64-bit integer, and if all are zero, then 64.
func TrailingZeros64(uint64) uint
// LeadingZeros32 counts the number of trailing zeros in a 32-bit integer, and if all are zero, then 32.
func LeadingZeros32(uint32) uint
// LeadingZeros64 counts the number of trailing zeros in a 64-bit integer, and if all are zero, then 64.
func LeadingZeros64(uint64) uint
// Ones32 counts the number of bits set in a 32-bit integer.
func Ones32(uint32) uint
// Ones64 counts the number of bits set in a 64-bit integer.
func Ones64(uint64) uint
์ด ์ ์์ ๋ํ ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ์ ์์ ๊ธฐ์กด stdlib API๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ค๋จํ์ง ์์ผ๋ฉฐ ํธํ์ฑ ์ง์นจ์ ์ค์ํฉ๋๋ค.
SwapBytes, TrailingZeros ๋ฐ LeadingZeros๋ ์ด๋ฏธ ๊ตฌํ๋์ด ์์ต๋๋ค. ์ ์ผํ ๋๋ฝ๋ ๊ธฐ๋ฅ์ ๋ค๋ฅธ ๊ธฐ๋ฅ๊ณผ ์ ์ฌํ๊ฒ ๊ตฌํํ ์ ์๋ ๊ฒ์ ๋๋ค. ์ด ์ ์์ด ์๋ฝ๋๋ฉด Go1.9์ ๋ง์ถฐ ๊ตฌํ๋ ์ ์์ต๋๋ค.
์ด๋ฆ์ ์ด๋ ต์ต๋๋ค. ์์ ๊ฑฐ ๋ณด๊ด์๋ ๋๊ธ์ ์์ต๋๋ค.
์๊ฒฌ์ ํฌํจ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ์ํ์ญ์์ค. ์ด์์ ์ผ๋ก๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ด stdlib(์: math/big), ๋๊ตฌ ๋๋ ์ธ๊ธฐ ์๋ ํจํค์ง์์ ์ฌ์ฉ๋๋ ์์น๋ฅผ ํฌํจํ์ญ์์ค.
์ง๊ธ๊น์ง ์ ์๋ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1์ 14์ผ: ์ธ์๊ฐ 0์ผ ๋ TrailingZeros ๋ฐ LeadingZeros์ ์ถ๋ ฅ์ ๋ช
ํํ ํ์ต๋๋ค.
1์ 14์ผ: ๋ฉ์๋ ์ด๋ฆ ๋ณ๊ฒฝ: CountTrailingZeros -> TrailingZeros, CountLeadingZeros -> LeadingZeros, CountOnes -> Ones.
1์ 13์ผ: ์ํคํ
์ฒ ์ด๋ฆ์ ์์ ํ์ต๋๋ค.
1์ 11์ผ: ์ด๊ธฐ ์ ์์ ๊ณต๊ฐ.
@brtzsnr ์ ์ ํ๋ก์ธ์ค ๋จ๊ณ์ ์ค๋ช ๋ ๋๋ก ์ด ๋ฌธ์๋ฅผ ์ ์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ์ถํด์ผ ํฉ๋๊น?
ํ ํ๋ฆฟ์ ๋ฐ๋ผ ์ด๋ฏธ ๋งํฌ๋ค์ด๋์ด ์์ผ๋ฏ๋ก design/18616-bit-twiddling.md(๋๋ ๋ฌด์์ด๋ ) ํ์ผ์ ์์ฑํ๋ CL์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๊ฐ ์ฌ์์ผ ํฉ๋๋ค.
@cespare from https://github.com/golang/proposal "์ ์๊ฐ ๋์์ธ ๋ฌธ์๋ฅผ ์์ฑํ๊ณ ์ถ๋ค๋ฉด ์์ฑํ ์ ์์ต๋๋ค." ๋์์ธ ๋ฌธ์๋ก ์์ํ๋๋ฐ, ์ ์ถํด์ผ ํ๋ค๋ ๊ฐํ ๋๋์ด ๋ ๋ค๋ฉด ์ ๊ด์ฐฎ์ต๋๋ค.
๋๋ ์ด๊ฒ์ผ๋ก ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. ๋ง์ ์๊ณ ๋ฆฌ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉ๋๋ ์ถฉ๋ถํ ๊ธฐ๋ฅ์ด๋ฉฐ ์ํ/๋นํธ๋ ์ ์ ํ ์ฅ์์ฒ๋ผ ๋ณด์ ๋๋ค.
(์๋ฅผ ๋ค์ด, math/big์ nlz(== clz)๋ ๊ตฌํํฉ๋๋ค.)
์๋ง๋ ์ด๋ฆ์ ๋ํด ์ฝ๊ฐ์ ์์ ๊ฑฐ ํ๋ฆฌ๊ธฐ๊ฐ์์ ๊ฒ์ ๋๋ค. ๋๋ ํจ์๊ฐ ๋ฌด์์ ํ๋ ๊ฒ๋ณด๋ค ๋ฐํํ๋ ๊ฒ์ ๋งํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์ด๋ ์ฐจ๋ก๋ก ๋ ์งง์ ์ด๋ฆ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
bits.TrailingZeros64(x)
์๋ bits.CountTrailingZeros64(x)
๊ธฐํ ๋ฑ๋ฑ.
์ ์์ ๋งค์ฐ ๋ช ํํ๊ณ ์ต์ํ์ผ๋ก ๋ณด์ ๋๋ค. ๋์์ธ ๋ฌธ์๋ ๋๋ฌด ๊ณผํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ์์ ์์ CL์ด ๋ ์ ์ ํ ๊ฒ ๊ฐ์ต๋๋ค.
(์ด๊ฒ์ API ๋ฐ ๊ธฐ๋ณธ ๊ตฌํ์ด ํฌํจ๋ CL์ ๋๋ค. - ์ค๊ณ ๋ฌธ์ ๋์ ํ ๋ก ์ ์ํ ๊ฒ์ ๋๋ค. ์ด ์ ์์ ์๋ฝํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.)
@brtzsnr ์ ์ด๋ฏธ ๋์์ธ ๋ฌธ์๋ฅผ ์์ฑํ์ต๋๋ค. ๋ฌธ์ ์ค๋ช ์ ์์ผ๋ฉฐ ํ ํ๋ฆฟ์ ๋ฐ๋ฆ ๋๋ค. ์ด๋ฌํ ๋ฌธ์๋ฅผ ํ ์์น์ ๋ชจ๋ ๋ณด๊ดํ๋ ๋ฐ๋ ์ด๋ ์ ๋ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
ํ๋์จ์ด ์ง์ ํ ์ด๋ธ์ ๋์ด๋ ๋ง์ง๋ง ์์น๋ "BSWAP"์ ๋๋ค. ์คํ๊ฐ ์์ต๋๊น?
์์ฑํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
ctz ๋ฐ clz์ ๋ํ ๋ฌธ์ ๋ฌธ์์ด์ 0์ ์ ๋ฌํ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
๋๋ ๋ํ CountTrailingZeros32๋ณด๋ค TrailingZeros32๋ฅผ ์ ํธํฉ๋๋ค. ๋๋ ๋ํ Ctz32์ ๋ง์กฑํ ๊ฒ์ ๋๋ค. ๊ฐ๊ฒฐํ๊ณ ๋๋ถ๋ถ์ ์ฌ๋๋ค์๊ฒ ์น์ํ๋ฉฐ ๋๋จธ์ง๋ ์ฝ๊ฒ ๊ตฌ๊ธ๋งํ ์ ์์ต๋๋ค.
์ ์ํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ง์นจ์๋ง ์ง์คํ๋ ๋์ ์ฌ์ฉ์ ์ง์คํ๊ณ ์ถ๋ค๊ณ ๋ง๋ถ์ด๊ณ ์ถ์ต๋๋ค. ์๋ฅผ ๋ค์ด @dr2chase ๋ ์ปดํ์ผ๋ฌ/์ด์
๋ธ๋ฌ์ ์ฌ๋ฌ log2
ํจ์๊ฐ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค. CLZ์ ๊ฐ๊น์ง๋ง ๋์ผํ์ง๋ ์์ต๋๋ค. ์ด์ ๊ฐ์ ๊ธฐ๋ฅ์ ์๋ง๋ ๋นํธ ํธ์๋ค๋ง ํจํค์ง์๋ ์์ ๊ฒ์
๋๋ค. ๋ํ ์ด๋ฌํ ์ง์นจ๊ณผ ๊ด๋ จ์ด ์๋ ์ ์ฉํ ๊ธฐ๋ฅ์ ํฌํจํ ์๋ ์์ต๋๋ค.
๋ค์์ผ๋ก ์ ์๋ ๋ชจ๋ ๋นํธ ํธ์๋ค๋ง ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋ํ ํจํค์ง๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
ํด์ปค์ ๊ธฐ์จ?
ํจํค์ง๋ฅผ ๋์์ธํ ๋ ๊ธฐ๋ฅ์ด
๋ด์ฌํ๋ ์๋ ์๊ณ ๊ทธ๋ ์ง ์์ ์๋ ์์ต๋๋ค. ์ต์ ํ๋ ๋์ค์ ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ทธ๊ฑด,
ํ์ ์์ค ๊ตฌํ์ด ์์ ์์ค ํจํค์ง๋ฅผ ์ ์ดํ๋๋ก ํ์ฉํ์ง ๋ง์ญ์์ค.
์ํธ ์์ฉ. ์ฐ๋ฆฌ๋ ๊ทธ๋ค ์ค ์ผ๋ถ๊ฐ ํ ์ ์๋๋ผ๋ ์ข์ ํจํค์ง ์ธํฐํ์ด์ค๋ฅผ ์ํฉ๋๋ค.
๋จ์ผ ๋ช
๋ น์ด์ ๋งคํ๋ฉ๋๋ค.
@minux , ๋คํ์ค๋ฝ๊ฒ๋ ์ง๊ธ๊น์ง ๋ด๊ฐ ํ์๋ก ํ๋ ๋ชจ๋
Hacker's Delight๋ฅผ ๋ฐ๋ฅด๋ฉด ์ด๋ฆ์ ๋ํด ๋ ผ์ํ๋๋ผ ์๊ฐ์ ๋ญ๋นํ ํ์๊ฐ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ค์์ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค.
ReverseBits(uint32 ๋ฐ uint64์ฉ)
RotateLeft/Right(2๊ต๋๋ก ์ธ๋ผ์ธ์ผ๋ก ํ์ฅํ ์ ์์ง๋ง ์ปดํ์ผ๋ฌ๋
์ํํธ ๋ฒ์ ๋ฌธ์ ๋ก ์ธํด ํญ์ ๋ณํ์ ์ํํ ์๋ ์์)
๋ํ๊ธฐ์ ๋นผ๊ธฐ์ ๋ ๊ฐ์ง ๊ฒฐ๊ณผ ํํ๋ ๋ ๊น์? ์
func AddUint32(x, y, carryin uint32) (carryout, sum uint32) // carryin์ ๋ฐ๋์
0 ๋๋ 1์ด ๋ฉ๋๋ค.
uint64๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
๊ทธ๋ฆฌ๊ณ SqrtInt.
๋ด ์ ์ ์ค ๋ง์ ๋ถ๋ถ์ ๋จ์ผ ๋ช
๋ น์ผ๋ก ๊ตฌํํ ์ ์์ง๋ง
์ด๊ฒ์ด ์์ ์
๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ํ ํจํค์ง๊ฐ ์๋๋ผ ์ฝ๊ฐ์ ์๋ฑํ ํจํค์ง๋ฅผ ์ํฉ๋๋ค.
์ธํธ๋ผ์์ค โโํจํค์ง. ํ๋์จ์ด๊ฐ ๋์ ์์ค์ ํจํค์ง๋ฅผ ์ ํํ์ง ์๋๋ก ํ์ญ์์ค.
์ํธ ์์ฉ.
์ด์ ๊ด๋ จํ์ฌ ๋ง์ /๊ณฑ์ ์ด ์ค๋ฒํ๋ก๋๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ํจ์์ ๋๋ค.
๊ด๋ จ ๋ฐ์ดํฐ ํฌ์ธํธ: ๋ ๋น ๋ฅธ cgo๋ฅผ ์ํด ์ ์ถ๋ ๋ค์ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌํ ์(์ ์ #16051)์์ bsr/ctz/etc์ ๋น ๋ฅธ ๊ตฌํ์ด ์์ต๋๋ค. ์๋ง๋ go๋ฅผ ์์ฑํ๋ ์ฌ๋๋ค์ด cgo๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํน๋๋ ์ผ๋ จ์ ์ฌ์ฉ ์ฌ๋ก์์ ์นฉ์ ์ ๊ฑฐํ๋ ๊ฒ์ผ๋ก ์ธ๊ธ๋์์ต๋๋ค.
@aclements๊ฐ 2016๋ 7์ 1์ผ์ ๋๊ธ์
@eloff , ์ง์๋๋ ๊ฒฝ์ฐ ๋ด์ฅ ํจ์๋ก ์ปดํ์ผ๋๋ popcount ๋ฐ bsr๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํ ๋ ผ์(๋ด ์ง์์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ ์์ ์์)๊ฐ ์์ต๋๋ค(์: ์ค๋๋ ์ math.Sqrt). 1.7์์๋ ๋ฐํ์์์ ์ด๊ฒ์ ์๋ํ๊ณ ์์ผ๋ฉฐ ์ด์ amd64 SSA์์ ์ฌ์ฉํ ์ ์๋ ctz ๋ด์ฅ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๋ถ๋ช ํ ๊ทธ๊ฒ์ด ์ ์ฒด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ ๋ชปํ์ง๋ง ๋ฎ์ ์ค๋ฒํค๋ ์ปจํ ์คํธ์์ cgo๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๋ ํ๋์ ์ด์ ๋ฅผ ์ ๊ฑฐํ ๊ฒ์ ๋๋ค.
๋ง์ ์ฌ๋๋ค(์ ํฌํจ)์ด ์ฑ๋ฅ ๋๋ฌธ์ ๋๋ฆฌ๋ฏ๋ก ๋นํธ ํธ์๋ค๋ง์ ๋ํ ํ์ฌ ์ ์๊ณผ ๊ฐ์ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค. (๊ทธ๋ฆฌ๊ณ ์, cgo๋ ์ด์ 1.8์์ ๋ ๋นจ๋ผ์ก์ต๋๋ค. ์ด๊ฒ๋ ์ข์ต๋๋ค.)
RotateLeft/Right(2๊ต๋๋ก ์ธ๋ผ์ธ์ผ๋ก ํ์ฅํ ์ ์์ง๋ง ์ปดํ์ผ๋ฌ๋
์ํํธ ๋ฒ์ ๋ฌธ์ ๋ก ์ธํด ํญ์ ๋ณํ์ ์ํํ ์๋ ์์)
@minux ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์์ธํ
@brtzsnr : Minux๊ฐ ๋งํ๋ ๊ฒ์ (x << k) | (x >> (64-k))
๋ฅผ ์ธ ๋ 0 <= k < 64
์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ ์์ง๋ง ์ปดํ์ผ๋ฌ๊ฐ ๋ง์์ ์ฝ์ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ฝ๋์์ ํ์๋ฉ๋๋ค. ์ฐ๋ฆฌ์๊ฒ ๊ธฐ๋ฅ์ด ์๋ค๋ฉด
func leftRot(x uint64, k uint) uint64 {
k &= 63
return (x << k) | (x >> (64-k))
}
๊ทธ๋ฐ ๋ค์ ์ปดํ์ผ๋ฌ๊ฐ k ๋ฒ์๊ฐ ์ ํ๋์ด ์์์ ์๊ณ ์๋์ง (&63์ ํตํด) ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๊ฐ ์
๋ ฅ์ด ์ ํ๋์ด ์์์ ์ฆ๋ช
ํ ์ ์์ผ๋ฉด ์ถ๊ฐ AND๊ฐ ํ์ํฉ๋๋ค. ํ์ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ ํ ์์ฑํ์ง ์๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค.
2017๋
1์ 13์ผ ๊ธ์์ผ ์คํ 10์ 37๋ถ, Keith Randall [email protected]
์ผ๋ค:
@brtzsnr https://github.com/brtzsnr : Minux๊ฐ ๋ฌด์์ ๋งํ๋ ๊ฒ ๊ฐ์์
(x << k) | (x >> (64-k)), 0์ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
<= k < 64, ๊ทธ๋ฌ๋ ์ปดํ์ผ๋ฌ๋ ๋น์ ์ ๋ง์์ ์ฝ์ ์ ์์ผ๋ฉฐ ๋ถ๋ช ํ
์ฝ๋์์ ํ์๋ฉ๋๋ค. ์ฐ๋ฆฌ์๊ฒ ๊ธฐ๋ฅ์ด ์๋ค๋ฉดfunc leftRot(x uint64, k uint) uint64 {
k &= 63
๋ฐํ (x << k) | (x >> (64-k))
}๊ทธ๋ฐ ๋ค์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฒ์๋ฅผ ์๊ณ ์๋์ง (&63์ ํตํด) ํ์ธํ ์ ์์ต๋๋ค.
k์ ๊ฒฝ๊ณ๊ฐ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๊ฐ ์ ๋ ฅ์ด ์ ํ๋์ด ์์์ ์ฆ๋ช ํ ์ ์์ผ๋ฉด ์ถ๊ฐ ์์ ์ด ํ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ . ํ์ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ ํ ์์ฑํ์ง ์๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค.์ค๋ฅธ์ชฝ. RotateLeft ๋ฐ RotateRight ํจ์๋ฅผ ์ ์ํ๋ฉด ๊ณต์์ ์ผ๋ก ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
์ผ์ชฝ/์ค๋ฅธ์ชฝ์ผ๋ก k ๋นํธ ํ์ ๊ธฐ๋ฅ์ ์ ์ํฉ๋๋ค(k๊ฐ ๋ฌด์์ด๋ ์๊ด์์). ์ด๊ฒ์
์ํํธ ์์ ์ด ์ ์๋๋ ๋ฐฉ์๊ณผ ์ ์ฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ ์ ๋ํ
์ค์ ํ์ ๋ช ๋ น์ ๋ฉ์ง๊ฒ ๋งคํ๋ฉ๋๋ค(๊ต๋์ ๋ฌ๋ฆฌ
์ง๊ด์ ์ธ ์ ์๋ ํน์ ์ํคํ ์ฒ์ ๋ํ ๋น๊ต๊ฐ ํ์ํฉ๋๋ค.
blosc ์์ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํธ ๋ฐ ๋นํธ ์ ํ๋ง(๋ฐ ์ธ์ ํ๋ง) ๊ธฐ๋ฅ์ ์ด๋ป์ต๋๊น? ์ฌ๋ผ์ด๋ (์ ํ์ ์ฌ๋ผ์ด๋ 17๋ถํฐ ์์๋จ). ์ด๋ฌํ ๊ธฐ๋ฅ์ SSE2/AVX2 ๊ฐ์์ด ๊ฐ๋ฅํฉ๋๋ค.
2017๋ 1์ 13์ผ ๊ธ์์ผ ์คํ 11์ 24๋ถ์ opennota [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
blosc์์ ์ฌ์ฉํ๋ ๋ฐ์ดํธ ๋ฐ ๋นํธ ์ ํ๋ง ๊ธฐ๋ฅ์ ์ด๋ป์ต๋๊น?
https://github.com/Blosc/c-blosc ์์ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ? ์ฌ๋ผ์ด๋
http://www.slideshare.net/PyData/blosc-py-data-2014 (์ ํ
์ฌ๋ผ์ด๋ 17)๋ถํฐ ์์ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ SSE2/AVX2 ๊ฐ์์ด ๊ฐ๋ฅํฉ๋๋ค.SIMD๋ ๋ ํฐ ๋ฌธ์ ์ด๋ฉฐ ์ด ํจํค์ง์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ์ด๊ฒ์
17373.
ํ์ฌ ์ ์๋ ๊ธฐ๋ฅ์ Go ๊ธฐ๋ณธ ๊ตฌํ์ด ์ต์ ๋ณด๋ค ํจ์ฌ ํฌ๊ณ ๋ถ๊ท ํ์ ์ผ๋ก ๋ ๋น์๋๋ค. ๋ฐ๋ฉด์ ํ์ ์ ์ปดํ์ผ๋ฌ๊ฐ ์ธ์ํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ธ๋ผ์ธ์ผ๋ก ์์ฑํ๊ธฐ ์ฝ์ต๋๋ค.
@minux ๋ฐ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋: ํ์ ๋ ๋นํธ ์๊ฐ ์ผ์ ํ์ง ์์ ๊ฒฝ์ฐ ์ผ์ชฝ/์ค๋ฅธ์ชฝ ํ์ ์ด ์ฌ์ฉ๋๋ ์์น๋ฅผ ์๊ณ ์์ต๋๊น? crypto/sha256์ ์๋ฅผ ๋ค์ด ํ์ ์ ์ฌ์ฉํ์ง๋ง ๋นํธ ์๋ ์ผ์ ํฉ๋๋ค.
ํ์ ์ ์ปดํ์ผ๋ฌ๊ฐ ์ธ์ํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ธ๋ผ์ธ์ผ๋ก ์์ฑํ๊ธฐ ์ฝ์ต๋๋ค.
์ปดํ์ผ๋ฌ์ ๋ด๋ถ์ ์ต์ํ ์ฌ๋๋ค์๊ฒ๋ ์ฝ์ต๋๋ค. ์ํ/๋นํธ ํจํค์ง์ ๋ฃ์ผ๋ฉด ๋๊ตฌ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ ๋ ๋นํธ ์๊ฐ ์ผ์ ํ์ง ์์ ๊ฒฝ์ฐ ์ผ์ชฝ/์ค๋ฅธ์ชฝ ํ์ ์ด ์ฌ์ฉ๋๋ ์์น๋ฅผ ์๊ณ ์์ต๋๊น?
๋ค์์ #9337์ ์์ ๋๋ค.
https://play.golang.org/p/rmDG7MR5F9
๊ฐ ํธ์ถ์์ ๋งค๋ฒ ํ์ ๋ ๋นํธ ์๋ ์ผ์ ํ์ง๋ง ํจ์ ์์ฒด๋ ํ์ฌ ์ธ๋ผ์ธ๋์ง ์์ผ๋ฏ๋ก ํ์ ๋ช ๋ น ์์ด ์ปดํ์ผ๋ฉ๋๋ค. ์ํ/๋นํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฅ์ด ํ์คํ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
2017๋
1์ 14์ผ ํ ์์ผ ์ค์ 5:05, Alexandru Moศoi [email protected]
์ผ๋ค:
ํ์ฌ ์ ์๋ ๊ธฐ๋ฅ์๋ ํจ์ฌ ๋ ํฐ Go ๋ค์ดํฐ๋ธ ๊ตฌํ์ด ์์ต๋๋ค.
์ต์ ๋ณด๋ค ๋ถ๊ท ํ์ ์ผ๋ก ๋ ๋น์๋๋ค. ๋ฐ๋ฉด์ ํ์
์ปดํ์ผ๋ฌ๊ฐ ์ธ์ํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ธ๋ผ์ธ์ผ๋ก ์์ฑํ๊ธฐ ์ฝ์ต๋๋ค.์ด ๋ฌธ์ ์์ ์ฌ๋ฌ ๋ฒ ๊ฐ์กฐํ๋ฏ์ด ์ด๊ฒ์ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ์๋๋๋ค.
Go ํจํค์ง๋ฅผ ๋์์ธํฉ๋๋ค. ๊ธฐ๋ณธ ํ๋์จ์ด์ ๋๋ฌด ๋ง์ด ์ฐ๊ฒฐ๋ฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ฌด์์
want ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉํ ์ฝ๊ฐ ์๋ฑํ ํจํค์ง์ ๋๋ค. ์ด๋
๊ธฐ๋ฅ์ ๋จ์ผ ๋ช ๋ น์ด๋ก ํ์ฅ๋ ์ ์์ต๋๋ค.
API ์ธํฐํ์ด์ค๋ ์ ์๋ ค์ ธ ์๊ณ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
@minux https://github.com/minux ๋ฐ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋: ์๊ณ ๊ณ์ญ๋๊น?
ํ์ ๋ ๋นํธ ์๊ฐ ์ผ์ ํ์ง ์์ ๊ฒฝ์ฐ ์ผ์ชฝ/์ค๋ฅธ์ชฝ ํ์ ์ด ์ฌ์ฉ๋๋ ๊ณณ์ ์ด๋์ ๋๊น?
crypto/sha256์ ์๋ฅผ ๋ค์ด ํ์ ์ ์ฌ์ฉํ์ง๋ง ๋นํธ ์๋ ์ผ์ ํฉ๋๋ค.์ค์ ๋ฌธ์ ์์ ํ์ ๋นํธ ์๊ฐ ์ผ์ ํ๋๋ผ๋
์ปดํ์ผ๋ฌ๋ ๊ทธ๊ฒ์ ๋ณด์ง ๋ชปํ ์๋ ์์ต๋๋ค. ์: ์ํํธ ์นด์ดํธ๊ฐ ์ ์ฅ๋ ๊ฒฝ์ฐ
๋ฐฐ์ด์์ ์จ๊ธฐ๊ฑฐ๋ ๋ฃจํ ์นด์ดํฐ์์ ์จ๊ธฐ๊ฑฐ๋ ์ธ๋ผ์ธ๋์ง ์์ ํธ์ถ์
๊ธฐ๋ฅ.
๊ฐ๋ณ ํ์ ์๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋จํ ์๋ ํฅ๋ฏธ๋กญ์ต๋๋ค.
ํ์นด์ดํธ ๊ตฌํ:
// https://play.golang.org/p/ctNRXsBt0z
func RotateRight(x, k uint32) uint32
func Popcount(x uint32) int {
var v uint32
for i := v - v; i < 32; i++ {
v += RotateRight(x, i)
}
return int(-int32(v))
}
@josharian ์ด ์์ ๋ rot์ด ์ธ๋ผ์ธ๋์ง ์์ ๊ฒฝ์ฐ ์๋ชป๋ ์ธ๋ผ์ธ ๊ฒฐ์ ์ฒ๋ผ ๋ณด์
๋๋ค. ๋น์ ์ ํจ์๋ฅผ ์์ฑํ๋ ค๊ณ ํ func rot(x, n)
๋์ rot = func(x, n)
?
@minux : ๋์ํฉ๋๋ค. API๋ฅผ ํน์ ๋ช ๋ น์ด ์ธํธ์ ์ฐ๊ฒฐํ๋ ค๋ ๊ฒ์ด ์๋๋๋ค. ํ๋์จ์ด ์ง์์ ์ข์ ๋ณด๋์ค์ ๋๋ค. ๋ด ์ฃผ์ ์ด์ ์ ์ปจํ ์คํธ๋ฅผ ์ดํดํ๊ธฐ ์ํด ์ค์ ์ฝ๋(์ฅ๋๊ฐ ์ฝ๋ ์๋)์์ ์ฌ์ฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฅ ์ข์ ์๋ช ์ ๋ฌด์์ด๋ฉฐ ๋ชจ๋ ์ฌ๋์ด ์ข์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ์ดํดํฉ๋๋ค. ์ง๊ธ ์ ๋๋ก ํ์ง ์์ผ๋ฉด ํธํ์ฑ ์ฝ์์ด ๋์ค์ ์ฐ๋ฆฌ๋ฅผ ๋ฌผ๋ฆด ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค๋ฉด: add with carry return์ ์๋ช
์ ๋ฌด์์ด์ด์ผ ํฉ๋๊น? Add(x, y uint64) (c, s uint64)
? math/big
๋ณด๋ฉด Add(x, y uintptr) (c, s uintptr)
๋ ํ์ํ ๊ฒ์
๋๋ค.
rot์ด ์ธ๋ผ์ธ๋์ง ์์ ๊ฒฝ์ฐ ์์ ๋ ์๋ชป๋ ์ธ๋ผ์ธ ๊ฒฐ์ ์ฒ๋ผ ๋ณด์ ๋๋ค.
์. ์ธ๋ผ์ธ์ ๋ํด ๋ถํํ๋ ๋ฒ๊ทธ์ ์ผ๋ถ์ ๋๋ค. :)
ํจ์๋ฅผ rot = func(x, n) ๋์ func rot(x, n)์ผ๋ก ์์ฑํ๋ ค๊ณ ํ์ต๋๊น?
๊ทธ๊ฒ์ ๋ด ์ฝ๋๊ฐ ์๋๋ฉฐ ๊ทธ๊ฒ์ด ์์ ์ ์ผ๋ถ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์จ๋ ํฉ๋ฆฌ์ ์ธ ์ฝ๋์ ๋๋ค.
ํ์ ๋ฐ ๋ฐ์ดํธ ์ค์ ๊ธฐ๋ฅ์ด ์ํธํ ์๊ณ ๋ฆฌ์ฆ์์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ผ์ ์๊ฐ ์์ ์์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ข์ต๋๋ค(ํจํค์ง ์ค๋ช ์์์?). ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๋ํด์๋ ์๊ฐํ ์ ์์ต๋๋ค.
2017๋
1์ 19์ผ ๋ชฉ์์ผ ์ค์ 11์ 50๋ถ, Michael Munday [email protected]
์ผ๋ค:
(ํจํค์ง ๋ฌธ์์์?)
ํ์ ๋ฐ ๋ฐ์ดํธ ์ค์ ๊ธฐ๋ฅ์ ์ผ์ ์๊ฐ ์์ ์ด๋ฏ๋ก
์ํธํ ์๊ณ ๋ฆฌ์ฆ์์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ง๋ ์๊ฐํด๋ณผ ๋ฌธ์
๋ค๋ฅธ ๊ธฐ๋ฅ์๋.๋ฐ์ดํธ ์ค์์ ์ฌ์ํ ๊ตฌํ์ ์ผ์ ํ ์๊ฐ์ด์ง๋ง ๊ธฐ๋ณธ
์ํคํ ์ฒ๋ ๊ฐ๋ณ ์ํํธ ๋ช ๋ น์ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก ์ด๋ ค์ธ ๊ฒ์ ๋๋ค.
์ผ์ ํ ์๊ฐ ํ์ ๊ตฌํ์ ๋ณด์ฅํฉ๋๋ค. ์๋ง๋ Go๋ ์คํ๋์ง ์์ ๊ฒ์ ๋๋ค
ํ์ง๋ง ๊ทธ ์ํคํ ์ฒ์.
์ฆ, ๊ธฐ์ ์ ๊น๋ฆด ๊ฐ๋ฅ์ฑ๋ ๋ฌด์ํ ์ ์์ต๋๋ค.
๋ง์ดํฌ๋ก์ํคํ
์ฒ๋ ๋ค์ค ์ฌ์ดํด ์ํํฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ณด์ฅํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ตฌํ์์ ์ผ์ ํ ์๊ฐ ํ์ ํฉ๋๋ค.
์๊ฒฉํ ์ผ์ ํ ์๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ ์๋ง๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ด์
๋ธ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์
๋๋ค.
(๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ๋ ๋ชจ๋
๋ช
๋ น ์์ฒด๋ ์์ ์๊ฐ์ด๋ฉฐ, ์ด๋
๋ง์ดํฌ๋ก์ํคํ
์ฒ.)
์ด๋ฌํ ๋ณด์ฅ์ ํ์์ฑ์ ์ดํดํ์ง๋ง ์ค์ ๋ก๋
์ฐ๋ฆฌ์ ํต์ .
๋๋ @minux์ ๋์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์์ ์ํธํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ํ๋ค๋ฉด ์ํธํ/๋ฏธ๋ฌํ๊ฒ ์ด์์ผ ํฉ๋๋ค. crypto/subtle์ ํด๋น ๊ตฌํ์ด ๊ฒ์ฆ๋ ํ๋ซํผ์์ ์ํ/๋นํธ๋ก ์ฝ๊ฒ ๋ฆฌ๋๋ ์ ํ ์ ์์ต๋๋ค. ๋๋ฆฌ์ง๋ง ์ง์์ ์ธ ๊ตฌํ์ด ํ์ํ ๊ฒฝ์ฐ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ํ ๊ฐ์น๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. @griesemer ์ @randall77 ์ ์์์ฌ์๊ฒ
์ด์ ์ด ์ ์์ ์งํํ ์ ์์ผ๋ฏ๋ก API์ ์ธ๋ถ ์ฌํญ์ ๋์ํด์ผ ํฉ๋๋ค. ํ์ฌ ๋ด๊ฐ ๋ณด๋ ์ง๋ฌธ:
uint64
, uint32
์ ์ฉ ๋๋ uint64
, uint32
, uint16
, uint8
, ๋๋ uintptr
)?TrailingZeroesxx(x uintxx) uint
, xx = 64, 32 ๋ฑ, vs TrailingZeroes(x uint64, size uint) uint
์ฌ๊ธฐ์ ํฌ๊ธฐ๋ 64, 32 ๋ฑ ์ค ํ๋) - ํ์๋ ๋ ์์ API๋ก ์ด์ด์ง ์ ์์ผ๋ฉฐ ๊ตฌํ์ ๋ฐ๋ผ ์ฌ์ ํ ์ถฉ๋ถํ ๋น ๋ฆ)@brtzsnr ์ด ๋ ธ๋ ฅ์ ๊ณ์ ์ฃผ๋ํ์๊ฒ ์ต๋๊น? ๋๋ ๋น์ ์ด ์ด๊ธฐ ๋์์ธ์ ๊ฐ์ ธ์ค๊ณ ์ด ๋ฌธ์ ์์ ๊ทธ๊ฒ์ ๋ฐ๋ณตํ๊ณ ์ถ๊ฑฐ๋ ์ ์ฉ ๋์์ธ ๋ฌธ์๋ฅผ ์ค์ ํ๋ ๊ฒ์ ์ ํธํ๋ ๊ฒฝ์ฐ์ ๊ด์ฐฎ์ต๋๋ค. ๋๋ ์ด๊ฒ์ ์ ํํ๊ณ ์์ผ๋ก ๋ฐ์ด๋ผ ์ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด 1.9 ๋จ๊ณ์์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ฒ ์๊ฐ ์๋ xx ์ด๋ฆ์ ์ ํธํฉ๋๋ค. bits.TrailingZeroes(uint64(x), 32)๋ bits.TrailingZeroes32(x), imo๋ณด๋ค ๋ ๋ณต์กํ๊ณ ๊ฐ๋ ์ฑ์ด ๋ฎ์ต๋๋ค. uintptr์ด ๋ ์ฝ์ต๋๋ค(xx = Ptr?).
๋ํ ์๋ฅผ ๋ค์ด ์ฒซ ๋ฒ์งธ ๋ฆด๋ฆฌ์ค์ uint8์ ํฌํจํ์ง ์์์ง๋ง ๋์ค์ ์ถ๊ฐํ๋ค๋ฉด ๋ ๋ถ๋ช ํด์ง ๊ฒ์ ๋๋ค. ๋์น๊ธฐ ์ฌ์ด ๋ฆด๋ฆฌ์ค ๋ฌธ์์ ๋ฉ๋ชจ์ ํจ๊ป ์ ํจํ ํฌ๊ธฐ ๋ชฉ๋ก์ผ๋ก ์ด๋ํฉ๋๋ค.
์ฒ ์๊ฐ ์๋ ์ด๋ฆ์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ Hacker์ ๊ธฐ์จ ์ฉ์ด๋ ์ค๋ช ์ "~๋ผ๊ณ ๋ ์๋ ค์ง"์ผ๋ก ํฌํจ๋์ด ์๋ชป๋ ์ฒ ์๋ฅผ ๊ฒ์ํ๋ ๊ฒฝ์ฐ ๊ฒ์(ํ์ด์ง ๋๋ ๊ฒ์ ์์ง์ ํตํด)์ด ํ์ค ์ด๋ฆ์ ์ฝ๊ฒ ์ฐพ์ ์ ์๋๋ก ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. .
์ ๋ ์ํ/๋นํธ๊ฐ ์ข์ ๊ณณ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋นํธ๊ฐ ์๋ ์ํ์ ๋๋ค.
SwapBytes{16,32,64}
๋ sync/atomic
๋ณด๋ค SwapBytes(..., bitSize uint)
sync/atomic
ํจ์์ ๋ ์ผ๊ด์ฑ์ด ์์ต๋๋ค.
์์ง๋ง strconv
ํจํค์ง๋ฅผ ์ฌ์ฉํ์ง ParseInt(..., bitSize int)
ํจํด ์ฌ์ด์ ๋ ๊ด๊ณ๊ฐ bits
๋ฐ atomic
์ ๊ฑฐ๊ธฐ๋ณด๋ค strconv
.
๋ด๊ฐ SwapBytes(uint64, size uint)๋ฅผ ์ข์ํ์ง ์๋ ์ธ ๊ฐ์ง ์ด์ :
@griesemer Robert, ์ ์์ ๋ฐ์์ฃผ์ธ์. ํ ๋ฌ ์์ ์ด ์ ์์ ์ถ์งํ ์๊ฐ์ด ์์ง๋ง ๊ทธ ๋๊น์ง ์งํ์ด ์ง์ฐ๋์ด์๋ ์ ๋ฉ๋๋ค.
ํ์์ ์๋ช ์ ๋ํ ๋ช ํํ ๊ธฐ๋ณธ ์ค์ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
func fffNN(x uintNN) uint
์ด๋ค NN์ ์ง์ํ ์ง ์ด์ด ๋ก๋๋ค. ๊ณ์๋๋ ๋ ผ์๋ฅผ ์ํด NN=64์ ์ด์ ์ ๋ง์ถ๊ฒ ์ต๋๋ค. ํ์์ ๋ฐ๋ผ ๋๋จธ์ง ์ ํ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค(uintptr ํฌํจ).
์ด๋ @brtzsnr ์ ์๋ ์ ์๊ณผ ๋ค์ ๊ธฐ๋ฅ(๋ฐ ๋ค์ํ ์ ํ์ ๋ํ ๊ฐ๊ฐ์ ๋ณํ) ๋ฐ ๊ทธ ๋์ ์ฌ๋๋ค์ด ์ ์ํ ๋ด์ฉ์ผ๋ก ๋ฐ๋ก ๋์๊ฐ๋๋ค.
// LeadingZeros64 returns the number of leading zero bits in x.
// The result is 64 if x == 0.
func LeadingZeros64(x uint64) uint
// TrailingZeros64 returns the number of trailing zero bits in x.
// The result is 64 if x == 0.
func TrailingZeros64(x uint64) uint
// Ones64 returns the number of bits set in x.
func Ones64(x uint64) uint
// RotateLeft64 returns the value of x rotated left by n%64 bits.
func RotateLeft64(x uint64, n uint) uint64
// RotateRight64 returns the value of x rotated right by n%64 bits.
func RotateRight64(x uint64, n uint) uint64
Swap ๊ธฐ๋ฅ ์ธํธ๋ ์์ ์ ์์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋๋ ์ด๊ฒ์ ๋ํด ํ์์ ์ ๋๋ค. 1) SwapBits๊ฐ ํ์ํ์ง ์์์ผ๋ฉฐ ๋๋ถ๋ถ์ SwapBytes ์ฌ์ฉ์ ์๋์์ ์ธ์ํ์ง ์์์ผ ํ ๋ ์ฝ๋๋ฅผ ์ธ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฝ๋ฉํธ?
// SwapBits64 reverses the order of the bits in x.
func SwapBits64(x uint64) uint64
// SwapBytes64 reverses the order of the bytes in x.
func SwapBytes64(x uint64) uint64
๊ทธ๋ฐ ๋ค์ ์ ์ ์ฐ์ฐ ์ธํธ๊ฐ ์์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค ์ค ์ผ๋ถ(์: Log2)๊ฐ ์ด ํจํค์ง์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๊ฐ๊น์ธ ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ๋ค์ ์ด ํจํค์ง์๋ง ์์ ๊ฒ์
๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋ค๋ฅธ ๊ณณ์ ์์ ์ ์์ต๋๋ค. ํจํค์ง ์ด๋ฆ bits
์ ์กฐ์ ํด์ผ ํ ์๋ ์์ต๋๋ค. ์ฝ๋ฉํธ?
// Log2 returns the integer binary logarithm of x.
// The result is the integer n for which 2^n <= x < 2^(n+1).
// If x == 0, the result is -1.
func Log2(x uint64) int
// Sqrt returns the integer square root of x.
// The result is the value n such that n^2 <= x < (n+1)^2.
func Sqrt(x uint64) uint64
๋ง์ง๋ง์ผ๋ก @minux ๋ AddUint32
๋ฑ๊ณผ ๊ฐ์ ์์
์ ์ ์ํ์ต๋๋ค. ์ฌ๋ฐ๋ฅด๊ฒ ์ง์ ํ๊ธฐ๊ฐ ๋ ๊น๋ค๋กญ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ง๊ธ์ ์๋ตํ๊ฒ ์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ๋ ๋ค์ํฉ๋๋ค). ๋์ค์ ๋ค์ ์ฐ๋ฝํ ์ ์์ต๋๋ค. ์์ ๋ด์ฉ์ ๋ํด ํฉ์๋ฅผ ๋ด
์๋ค.
์ง๋ฌธ:
๋๋ ๊ธด ํจ์ ์ด๋ฆ์ ์ ํธํฉ๋๋ค. Go๋ ํจ์ ์ด๋ฆ์ ์ฝ์ด๋ฅผ ํผํฉ๋๋ค. ๋๊ธ์ ๊ทธ๋ฐ ์์ผ๋ก ํจํค์ง๋ฅผ ๊ฒ์ํ๋ ์ฌ๋๋ค์ ๋ณ๋ช ("nlz", "ntz" ๋ฑ)์ ๋งํ ์ ์์ต๋๋ค.
@griesemer๋ , ๋ฉ์์ง์ ์คํ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฃผ์์ด ํจ์ ์๋ช ๊ณผ ์ผ์นํ์ง ์์ต๋๋ค.
์์ถ ์์ฉ ํ๋ก๊ทธ๋จ์์ SwapBits
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฆ, ์ฃผ์ ์ํคํ
์ฒ๊ฐ ๋นํธ ๋ฐ์ ์ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๊น? ๋๋ ๋ด ์์ ์ ์ฝ๋์์ ํ ๊ณํ์ด์์ต๋๋ค.
v := bits.SwapBytes64(v)
v = (v&0xaaaaaaaaaaaaaaaa)>>1 | (v&0x5555555555555555)<<1
v = (v&0xcccccccccccccccc)>>2 | (v&0x3333333333333333)<<2
v = (v&0xf0f0f0f0f0f0f0f0)>>4 | (v&0x0f0f0f0f0f0f0f0f)<<4
@bradfitz , @dsnet : ์ ๋ฐ์ดํธ๋ ์๋ช (์คํ ์์ ). ๋ํ ์ ๋ฐ์ดํธ๋ ์ง๋ฌธ(์ฌ๋๋ค์ ๋ฐ๋ก ๊ฐ๊ธฐ์ ๋ช ์์ ์ด๋ฆ์ ์ ํธํจ).
๋นํธ ์ค์ํ์ ๋ํ ๊ธฐ๋ณธ ์ง์์ด ์์ผ๋ฉด SwapBits
์๋ตํ๋ ๋ฐ ํฌํํ๊ฒ ์ต๋๋ค. ๋นํธ๊ฐ ๊ฐ ๋ฐ์ดํธ ๋ด์์๋ง ๊ตํ๋๋์ง ๋๋ ์ ์ฒด uint64์์ ๊ตํ๋๋์ง ์ฌ๋ถ๋ ์ด๋ฆ๋ง์ผ๋ก ์ฝ๊ฐ ๋ชจํธํ ์ ์์ต๋๋ค.
์ง์นจ ๊ฐ์ฉ์ฑ๋ง์ ๊ธฐ์ค์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ์ ์ธํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ๋ฆฌ๋ฒ์ค ๋นํธ
FFT์์ ์ฃผ๋ชฉํ ๋งํ ์ฉ๋๊ฐ ์์ต๋๋ค.
์ญ ๋นํธ ๋ช
๋ น์ด ๊ฐ์ฉ์ฑ์ ๋ํ ๊ทํ์ ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด: arm์๋
RBIT ๋ช
๋ น.
@griesemer ๋ค์๊ณผ ๊ฐ์ ํจ์์ ์ ํ ์๋ช ๋งํผ
func Ones64(x uint64) uint
func RotateLeft64(x uint64, n uint) uint64
RotateLeftN
๋ฑ์ ์ฉ์ดํ ๋ด๋ฉดํ์ ํ์ํ๊ธฐ ๋๋ฌธ์(๊ฐ๋ฅํ ๊ฒฝ์ฐ) ๋๋ ๋จ์ง ๊ทธ๊ฒ์ด ๋๋ฉ์ธ์ด๊ธฐ ๋๋ฌธ์ ๋จ์๋ฅผ ์ฌ์ฉํฉ๋๊น? ๊ฐ๋ ฅํ ๊ธฐ์ ์ ์๊ตฌ๊ฐ ์๋ค๋ฉด ์์ ๊ฐ์ด ์ดํด๋์ง ์๋๋ผ๋ int๋ฅผ ์ทจํ๋ ๋ ๊ฐ๋ ฅํ ์ ๋ก๊ฐ ์์ต๋๋ค. ๊ฐ๋ ฅํ ๊ธฐ์ ์ ์๊ตฌ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ท์น์ฑ์ ์ํ ์ ์ ํ N์ ๋ํด uintN์ด์ด์ผ ํฉ๋๊น?
OnesN
์ ๊ด๊ณ์์ด ํด๋น ilk๋ int๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด๋ฌํ ์ฐ์ฐ์ ๋ค๋ฅธ ๋นํธ ์ฐ์ฐ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ ์ด ๊ฒฝ์ฐ ์ ์ ํ N์ ๋ํด uintN์ ๋ฐํํด์ผ ํฉ๋๋ค.
@jimmyfrasche ๋๋ฉ์ธ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. cpu๋ ์๊ด์์ต๋๋ค. ๋ฌด์ธ๊ฐ๊ฐ int์ธ์ง uint์ธ์ง๋ ๋น๊ต๋ฅผ ์ ์ธํ ๋๋ถ๋ถ์ ์์ ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ์ฆ, int๋ก ๋ง๋ค๋ฉด ๊ฒฐ์ฝ ์์(๊ฒฐ๊ณผ)๊ฐ ์๋๊ฑฐ๋ ์์๊ฐ ์๋์ด์ผ ํ๋ค๊ณ (์ธ์) ์ค๋ช ํ๊ฑฐ๋ ์์(ํ์ ์ ๋ํ ์ธ์)์ผ ๋ ์ํํด์ผ ํ ์์ ์ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ํ๋์ ํ์ ์ผ๋ก ๋ฒ์ด๋ ์ ์์ต๋๋ค.
๋๋ int๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ์ ๋ ์ฝ๊ฒ ๋ง๋ ๋ค๊ณ ํ์ ํ์ง ์๋๋ค. ์ ์ ํ๊ฒ ์ค๊ณ๋ ๊ฒฝ์ฐ ๋จ์๋ ๋จ์๋ก ํ๋ฅด๊ณ (math/big์ ๊ฒฝ์ฐ) ๋ณํ์ด ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณํ์ด ํ์ํ๋๋ผ๋ CPU ๋น์ฉ ์ธก๋ฉด์์(๊ฐ๋ ์ฑ ์ธก๋ฉด์์๋ ์๋) ๋ฌด๋ฃ์ ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ ๋ฃ๊ฑฐ๋ ๋ณด๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
ํ์ ๋นํธ ์๋ uint์ฌ์ผ ํฉ๋๋ค(ํน์ ํฌ๊ธฐ ์์).
์ธ์ด์ ์ํํธ ์ฐ์ฐ์.
int๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ชจํธ์ฑ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
RotateRight -2๋นํธ๋ RotateLeft 2๋นํธ์ ๊ฐ์ต๋๋ค.
@minux Rotate(x, n)
๊ฐ x
๋งํผ n mod 64
๋นํธ๋ก ํ์ ํ๋๋ก ์ ์๋ ๊ฒฝ์ฐ ๋ชจํธํจ์ด ์์ต๋๋ค. ์ผ์ชฝ์ผ๋ก 10๋นํธ ํ์ ํ๋ ๊ฒ์ 64-10 = 54๋นํธ๋ก ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋๋ (int ์ธ์๋ฅผ ํ์ฉํ๋ ๊ฒฝ์ฐ) -10๋นํธ(์์ ๊ฐ์ด ์ผ์ชฝ ํ์ ์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ). -10 mod 64 = 54. ์๋ง๋ CPU ๋ช
๋ น์ผ๋ก๋ ํจ๊ณผ๋ฅผ ๋ฌด๋ฃ๋ก ์ป์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, 32๋นํธ x86 ROL/ROR ๋ช
๋ น์ด๋ ์ด๋ฏธ CL ๋ ์ง์คํฐ์ ๋งจ ์๋ 5๋นํธ๋ง ๋ณด๊ณ 32๋นํธ ํ์ ์ ๋ํด mod 32๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ํํฉ๋๋ค.
์ ์ผํ ์ค์ ์ธ์๋ ๋๋จธ์ง stdlib์์ ๊ท์น์ฑ์ ๋๋ค. uint๊ฐ ๋ง์ ์๋ฏธ๊ฐ ์์ง๋ง int๊ฐ ๋์ ์ฌ์ฉ๋๋ ๊ณณ์ด ๋ง์ด ์์ต๋๋ค.
math/big์ ์ฃผ๋ชฉํ ๋งํ ์์ธ์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋ค๋ฅธ ๊ฒ์ ๋ฌธ์ ๊ฐ ์์ง๋ง ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ ๋๋ค.
@minux ๋ ๊ตฌํ์ ๋ชจํธ์ฑ๋ณด๋ค๋ ์ฝ๋๋ฅผ ์ฝ๊ณ /๋๋ฒ๊น ํ๋ ์ฌ๋์๊ฒ ๋ชจํธ์ฑ์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ uint๋ฅผ ์ฌ์ฉํ๋ ์ค๋๋ ฅ ์๋ ์ธ์์ ๋๋ค.
ํจํค์ง ์ด๋ฆ์ด ์ด๋ฏธ ๋นํธ๋ผ๊ณ ํ๋ ๊ฒฝ์ฐ bits.SwapBits์ ์ค์ ๋ก ๋นํธ ์ ๋ฏธ์ฌ๋ฅผ ๋ถ์ฌ์ผ ํฉ๋๊น? ๋นํธ์ค์์ ์ด๋์?
๋ ๋ค๋ฅธ ์์ด๋์ด๋ bits.SwapBytes๊ฐ ์๋ bits.SwapN(v uint64, n int)์ ๋๋ค. ์ฌ๊ธฐ์ n์ ์ค์์ ์ํด ๊ทธ๋ฃนํํ ๋นํธ ์๋ฅผ ๋ํ๋ ๋๋ค. n=1์ผ ๋ ๋นํธ๊ฐ ๋ฐ์ ๋๊ณ n=8์ผ ๋ ๋ฐ์ดํธ๊ฐ ์ค์๋ฉ๋๋ค. ํ ๊ฐ์ง ์ด์ ์ bits.SwapBytes๊ฐ ๋ ์ด์ ์กด์ฌํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋น๋ก n์ ๋ค๋ฅธ ๊ฐ์ ๋ํ ํ์์ฑ์ ๋ณธ ์ ์ด ์์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์ ๋์ํ์ง ์์ ์๋ ์์ต๋๋ค.
์์์ ์ง์ ํ ๋๋ก LeadingZeros64
, TrailingZeros64
, Ones64
๋ชจ๋ LGTM.
์๋ช
๋ ํ์ ๊ธ์ก์ด ์๋ ๋จ์ผ Rotate64
๊ฐ ๋งค๋ ฅ์ ์
๋๋ค. ๋๋ถ๋ถ์ ํ์ ์ ์ผ์ ํ ์๋งํผ ์ด๋ฃจ์ด์ง๋ฏ๋ก(์ด๊ฒ์ด ๋ด์ฅ์ด ๋๋ ๊ฒฝ์ฐ) ๋ณ๋์ ์ค๋ฅธ์ชฝ/์ผ์ชฝ ๊ธฐ๋ฅ์ด ์์ด๋ ๋ฐํ์ ๋น์ฉ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
๋๋ ๋นํธ/๋ฐ์ดํธ ์
ํ๋ง/์ค์ํ/์ญ๋ฐฉํฅ์ ๋ํ ๊ฐํ ์๊ฒฌ์ด ์์ต๋๋ค. ๋ฐ์ ๋นํธ์ ๊ฒฝ์ฐ bits.Reverse64
๊ฐ ๋ ๋์ ์ด๋ฆ์ฒ๋ผ ๋ณด์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ง๋ bits.ReverseBytes64
? Swap64
์ด ์ฝ๊ฐ ๋ถ๋ถ๋ช
ํฉ๋๋ค. Swap64
์ด ๊ทธ๋ฃน ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋งค๋ ฅ์ ์ด์ง๋ง ๊ทธ๋ฃน ํฌ๊ธฐ๊ฐ 64๋ฅผ ๊ท ๋ฑํ๊ฒ ๋๋์ง ์์ ๋ ๋์์ ๋ฌด์์
๋๊น? ์ค์ํ ๊ทธ๋ฃน ํฌ๊ธฐ๊ฐ 1
๋ฐ 8
์ธ ๊ฒฝ์ฐ ๋ณ๋์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด ๋ ๊ฐ๋จํฉ๋๋ค. ๋๋ ๋ํ ์๊ฐ์ ์ป๊ธฐ ์ํด arm64 ๋ฐ amd64 BMI2 ๋ช
๋ น์ด๋ฅผ ๋ณด๊ณ ์ผ๋ฐ์ ์ธ ๋นํธ ํ๋ ์กฐ์์ด ๋ ๋์์ง ์ฌ๋ถ๋ ๊ถ๊ธํฉ๋๋ค.
์ ์ ์ํ ํจ์๊ฐ ์ด ํจํค์ง์ ์ํ๋ค๊ณ ํ์ ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๊ตฌํ์์ ๋นํธ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ํจํค์ง ์ํ์ ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ๊ด๋ จํ์ฌ func Sqrt(x uint64) uint32
( uint64
๋ฅผ ๋ฐํํ๋ ๋์ )๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
AddUint32
์ ์น๊ตฌ๋ค์ด ๋ณต์กํ๊ธด ํ์ง๋ง ์ธ์ ๊ฐ๋ ๋ค์ ๋ง๋๊ธธ ๋ฐ๋๋ค. ๋ค๋ฅธ ๊ฒ๋ค๊ณผ ํจ๊ป MulUint64
๋ ์ด์ํ RISC-V ISA์กฐ์ฐจ๋ ์ง์นจ์ผ๋ก ์ ๊ณตํ๋ HMUL์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ๋ค, ๋จผ์ ๋ฌด์ธ๊ฐ๋ฅผ ์์ํฉ์๋ค. ๋์ค์ ์ธ์ ๋ ์ง ํ์ฅํ ์ ์์ต๋๋ค.
bits
๋ ๋ถ๋ช
ํ ์ฌ๋ฐ๋ฅธ ํจํค์ง ์ด๋ฆ์ฒ๋ผ ๋ณด์
๋๋ค. ๊ฐ์ ธ์ค๊ธฐ ๊ฒฝ๋ก๊ฐ math/bits
๊ฐ ์๋๋ผ bits
์ฌ์ผ ํ๋ค๊ณ ๋งํ๊ณ ์ถ์ง๋ง ๊ทธ๋ ๊ฒ ๊ฐํ๊ฒ ๋๊ปด์ง์ง๋ ์์ต๋๋ค.
bits๋ ๋ถ๋ช ํ ์ฌ๋ฐ๋ฅธ ํจํค์ง ์ด๋ฆ์ฒ๋ผ ๋ณด์ ๋๋ค. ๊ฐ์ ธ์ค๊ธฐ ๊ฒฝ๋ก๋ ์ํ/๋นํธ๊ฐ ์๋ ๋นํธ์ฌ์ผ ํ๋ค๊ณ ๋งํ๊ณ ์ถ์ง๋ง ๊ทธ๋ ๊ฒ ๊ฐํ๊ฒ ๋๊ปด์ง์ง๋ ์์ต๋๋ค.
IMO, bits
์ด๋ฉด (ํจํค์ง ๋ฌธ์๋ฅผ ์ฝ์ง ์๊ณ ) bytes
ํจํค์ง์ ๋ค์ ๋น์ทํ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ์ฆ, ๋นํธ์ ๋ํด ์๋ํ๋ ๊ธฐ๋ฅ ์ธ์๋ ๋ฐ์ดํธ ์คํธ๋ฆผ์์/๋ก๋ถํฐ ๋นํธ๋ฅผ ์ฝ๊ณ ์ฐ๊ธฐ ์ํด Reader
๋ฐ Writer
๋ฅผ ์ฐพ์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. math/bits
๋ง๋ค๋ฉด ์ํ ๋น์ ์ฅ ๊ธฐ๋ฅ ์งํฉ์ด๋ผ๋ ๊ฒ์ด ๋ ๋ถ๋ช
ํด์ง๋๋ค.
(๋นํธ ์คํธ๋ฆผ์ ๋ํด Reader/Writer๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ์ํ์ง ์์ต๋๋ค)
์๋ช ๋ ํ์ ๋์ด ์๋ ๋จ์ผ ํ์ 64๊ฐ ๋งค๋ ฅ์ ์ ๋๋ค. ๋๋ถ๋ถ์ ํ์ ์ ์ผ์ ํ ์๋งํผ ์ด๋ฃจ์ด์ง๋ฏ๋ก(์ด๊ฒ์ด ๋ด์ฅ์ด ๋๋ ๊ฒฝ์ฐ) ๋ณ๋์ ์ค๋ฅธ์ชฝ/์ผ์ชฝ ๊ธฐ๋ฅ์ด ์์ด๋ ๋ฐํ์ ๋น์ฉ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
ํ์ ์ผ์ชฝ/์ค๋ฅธ์ชฝ์ ํ๋์ Rotate
๋ก ๊ฒฐํฉํ์ฌ ์ฝ๊ฐ ๋ ์์ ํจํค์ง API๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ผ๋ง๋ ํธ๋ฆฌํ์ง ์ ์ ์์ง๋ง n
๋งค๊ฐ๋ณ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํจ๊ณผ์ ์ผ๋ก ๋ฌธ์ํํ๋ ๋ฌธ์ ๋ ์์ต๋๋ค. ๋ค์์ ๋ํ๋
๋๋ค.
n
๊ฒฐ๊ณผ ์ผ์ชฝ ํ์ n
๊ฒฐ๊ณผ ๋ณ๊ฒฝ ์์n
๊ฒฐ๊ณผ ์ค๋ฅธ์ชฝ ํ์ ๋์๊ฒ ์ถ๊ฐ๋ ์ ์ ์ ๋ฐ ๋ฌธ์ ์ค๋ฒํค๋๋ ๋์ ๋จ์ผ Rotate
๋ก ๊ฒฐํฉํ๋ ๊ฒ์ ์ ๋นํํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. n
๊ฐ uint
์ธ ๋ช
์์ RotateLeft
๋ฐ RotateRight
๊ฐ๋ ๊ฒ์ด ๋ ์ง๊ด์ ์ผ๋ก ๋๊ปด์ง๋๋ค.
@mdlayher n๋นํธ ์๋์ ๊ฒฝ์ฐ ์ผ์ชฝ์ผ๋ก k๋นํธ ํ์ ํ๋ ๊ฒ์ nk๋นํธ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ๋ ๊ฐ์ ํจ์๋ก ๋ถ๋ฆฌํ๋๋ผ๋ ์ผ์ชฝ์ผ๋ก k ๋นํธ๋งํผ ํ์ ํ๋ค๋ ๊ฒ์ ํญ์ (k mod n) ๋นํธ๋งํผ ํ์ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๋ ๊ฒ์ ์ดํดํด์ผ ํฉ๋๋ค(n ๋นํธ ์ด์ ํ์ ํ๋ฉด ๋ค์ ์์ํฉ๋๋ค). ๊ทธ๋ ๊ฒ ํ๋ฉด ํ์ ๊ธฐ๋ฅ์ด ํญ์ k mod n ๋นํธ๋งํผ ํ์ ํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค. ์์ ๊ฐ์ด๋ ๋ ๋ฒ์งธ ๊ธฐ๋ฅ์ ์ค๋ช ํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ์๋ํฉ๋๋ค. ์ค์ ๋ก๋ ๋ ๊ฐ๋จํฉ๋๋ค.
๊ฒ๋ค๊ฐ ํ๋์จ์ด(์: x86)๋ ์์ k๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์๋์ผ๋ก ์ด ์์ ์ ์ํํฉ๋๋ค.
@griesemer , Rotate
์ ๋จ์ ์ ์ด๋ ๋ฐฉํฅ์ด ์์์ธ์ง ๋งํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. Rotate32(1, 1)
2 ๋๋ 0x80000000๊ณผ ๊ฐ์ต๋๊น? ์๋ฅผ ๋ค์ด, ๋ด๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์ฝ๊ณ ์๋ค๋ฉด ๊ฒฐ๊ณผ๊ฐ 2๊ฐ ๋ ๊ฒ์ผ๋ก ์์ํ์ง๋ง ๋ถ๋ช
ํ @mdlayher ๋ 0x80000000์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ๋ฐ๋ฉด์ RotateLeft
๋ฐ RotateRight
๋ ์๋ช
๋ ์ธ์ ๋๋ ์๋ช
๋์ง ์์ ์ธ์๋ฅผ ์ทจํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ช
ํํ ์ด๋ฆ์
๋๋ค. (RotateRight by -2๊ฐ RotateLeft 2์ ๊ฐ์์ง ์ฌ๋ถ๊ฐ ๋ชจํธํ๋ค๋ @minux์ ์๊ฒฌ์ ๋์ํ์ง ์์ต๋๋ค. ์ด๊ฒ๋ค์ ๋ถ๋ช
ํ ์ ์ ๋๋ฑํด ๋ณด์ด๋ฉฐ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ง์ ํ ์ ์์ต๋๋ค.)
RotateLeft64 ๋ผ๋ ํ๋์ ํจ์๋ง ๊ฐ๊ณ ์์ ๊ฐ์ ์ฌ์ฉํ์ฌ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ํ๋ฉด @aclements๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ๋๋ ๋ฌธ์์ ํจ๊ป. (FWIW, ๊ทํ์ ์์์๋ 0x800000000์ด ์๋ 2๋ ์์ํฉ๋๋ค.)
๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ์ด์ํ ์กฐ๊ธ ๋ณด์ด์ง๋ง @josharian, ๋ด๊ฐ ๋์ RotateLeft
๋ํ์ง ์๊ณ RotateRight
. ๋ถํธ ์๋ ํ์ ์ ๊ฐ๋ ์ผ๊ด์ฑ์ ํ์ ์ด ๊ณ์ฐ๋๋ ๊ฒฝ์ฐ ์ ์ฌ์ ์ผ๋ก ๊ฐ์น๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ผ์ ํ ํ์ ์ ๊ฒฝ์ฐ "์์ 2๋นํธ๋ฅผ ๋๋ด์ผ๋ก ์ผ์ชฝ์ผ๋ก ํ์ "๋ณด๋ค "์ค๋ฅธ์ชฝ์ผ๋ก 2๋นํธ ํ์ "์ด๋ผ๋ ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฌธ์๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋์ ๋ฌธ์ ๋ ๋ฌธ์๊ฐ ํจ์๋ฅผ ํธ์ถํ๋ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์์ด ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
์ฝ๋๋ฅผ ์์ฑํ๋ ์ฌ๋๋ค์ ์ผ์ชฝ์ผ๋ก ํ์ ํ๊ฑฐ๋ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ทธ๋ค์ ์ข์ฐ๋ก ํ์ ํ๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ์ผ์ชฝ ํ์ ๋ง ์ ๊ณตํ๋ค๋ฉด ์ค๋ฅธ์ชฝ ํ์ ์ ์ํ๋ ์ฌ๋์ ์ค๋ฅธ์ชฝ ํ์ ์ ์ผ์ชฝ ํ์ ์ผ๋ก ๋ณํํ๋ ํํ์์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์ปดํจํฐ๊ฐ ํ์ฐฎ๊ฒ ํ ์ ์๋ ํํ์ด์ง๋ง ํ๋ก๊ทธ๋๋จธ๋ ์ค์๋ฅผ ํ ๊ฒ์ ๋๋ค. ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์์ฑํ๊ฒ ํฉ๋๊น?
ํ์ ํฉ๋๋ค.
@aclements @ianlancetailor ํฌ์ธํธ๊ฐ
์ด๋ฆ ์์ด๋์ด๋ ์๋ช
์ด๋ฆ ๋์ ํจํค์ง ์ด๋ฆ์ ์ ํ์ ๋ฃ๋ ๊ฒ์
๋๋ค. bits64.Ones
๋์ bits.Ones64
.
@btracey ๊ฑฐ๊ธฐ์ ์
์ ์ด์ง ํ ํ์ด์. :) ์ฐ๋ฆฌ๋ flag64.Int
๋๋ math64.Floatfrombits
๋๋ sort64.Floats
๋๋ atomic64.StoreInt
.
@bradfitz golang.org/x/image/math/f64 ๋ฐ golang.org/x/image/math/f32๊ฐ ์กด์ฌํ์ง๋ง
๋๋ atomic
์ ๋ํด ์ ๋ก๋ก ์๊ฐํ์ง ์์์ต๋๋ค. ํจํค์ง๊ฐ ์ฌ๋ฌ ๋ค๋ฅธ ์ ํ์ ๋ํด ๋ฐ๋ณต๋๋ ํจ์ ์งํฉ๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์๋ ๋ค๋ฆ
๋๋ค.
๋ฌธ์๋ bits64
๋ก ์ด๋ํ์ฌ
Ones
LeadingZeros
TrailingZeros
bits
์ ๊ฐ์ ๋ณด๋ ๋์
Ones8
Ones16
Ones32
Ones64
LeadingZeros8
...
@iand , ๊ทธ๊ฒ๋ ๊ฝค
Go์์๋ pkg64.foo ๋์ pkg.foo64 ์ด๋ฆ ์ง์ ์คํ์ผ์ ์ฌ์ฉํ๋ ๊ฐ๋ ฅํ ์ ๋ก๊ฐ ์์ต๋๋ค.
ํจํค์ง API๋ n๊ฐ์ ์ ํ์ด ์์ผ๋ฉด n๋ฐฐ ์ปค์ง์ง๋ง API ๋ณต์ก์ฑ์ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์์ go doc๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ํตํด API๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ๋์ :
// TrailingZeros16 returns the number of trailing zero bits in x.
// The result is 16 if x == 0.
func TrailingZeros16(x uint16) uint
// TrailingZeros32 returns the number of trailing zero bits in x.
// The result is 32 if x == 0.
func TrailingZeros32(x uint32) uint
// TrailingZeros64 returns the number of trailing zero bits in x.
// The result is 64 if x == 0.
func TrailingZeros64(x uint64) uint
API๋ฅผ ๋ณผ ๋ ์ ์ ์ ์ค๋ฒํค๋๊ฐ ๋ถ๋ช ํ ์ถ๊ฐ๋๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์์ต๋๋ค.
// TrailingZerosN returns the number of trailing zero bits in a uintN value x for N = 16, 32, 64.
// The result is N if x == 0.
func TrailingZeros16(x uint16) uint
func TrailingZeros32(x uint32) uint
func TrailingZeros64(x uint64) uint
godoc์ ๊ทธ๋ฐ ์๋ฏธ์์ ์ ์ฌํ ๊ธฐ๋ฅ์ ๋ํด ํ๋ช ํ ์ ์์ผ๋ฉฐ ๋จ์ผ doc ๋ฌธ์์ด์ ์ฌ์ฉํ์ฌ ๊ทธ๋ฃน์ผ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ค๋ฅธ ํจํค์ง์์๋ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์์ฝํ์๋ฉด, ์ ์๋ ๋ช ๋ช ์ฒด๊ณ๋ Go ์ ํต์์ ํ๋ฅญํด ๋ณด์ธ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๋ ์ ํ ์ด์ ๋ฌธ์ ๋ ๋ค๋ฅธ ๊ณณ์์ ๋ ผ์ํ ์ ์๋ ๋ณ๋์ ์ง๋ฌธ์ ๋๋ค.
ํจํค์ง ์ด๋ฆ์ ๋นํธ ํฌ๊ธฐ๋ฅผ ๋ฃ์ ๋ +1.
bits64.Log2๋ bits.Log264๋ณด๋ค ๋ ์ ์ฝํ๋๋ค.
๊ฒฐ๊ตญ, ์ค์นผ๋ผ ์ ํ์ ์ํด "๋งค๊ฐ๋ณ์ํ๋" ๊ฐ ์ ํ์ ๋ํด ๋์ผํ API์ด๋ฏ๋ก ํจ์ ์ ํ ๊ฐ์ ๋์ผํ ์ด๋ฆ์ด ์๋ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ๋ณ๋์ ํจํค์ง๋ก ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. ๊ฐ์ ธ์ค๊ธฐ ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค(์ ์ฒด ๋จ์ด ๊ต์ฒด๋ gofmt -r์์๋ ์ฌ์ํ์ง๋ง ์ฌ์ฉ์ ์ ์ ์ ๋ฏธ์ฌ ๋ณํ์ ๋ ์ด์ํฉ๋๋ค.
ํจ์ ์ด๋ฆ์ ๋นํธ ํฌ๊ธฐ ์ ๋ฏธ์ฌ๊ฐ ๊ด์ฉ์ ์ผ ์ ์๋ค๋ @griesmeyer์ ๋ง์ ๋์ํ์ง๋ง ์ ํ๊ณผ ๋ฌด๊ดํ ํจํค์ง์ ์ค์ํ์ง ์์ ์ฝ๋๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ธ์ฝ๋ฉ/๋ฐ์ด๋๋ฆฌ์์ ํ๋ ์ด๋ฅผ ํ์ณ Uint64, Uint32, ...๋ผ๋ ์ด๋ฆ์ ๋ณ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
bit.Uint64.RightShift
bits.Uint8.Reverse
bit.Uintptr.Log2
...
@griesemer ๊ทธ๋ฃนํ ๋ฐฉ๋ฒ์ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น? ๋ฌธ์์์ ์ค์ ์ด๋ฆ ๋์ N์ผ๋ก ๋๋๋ ํจ์ ์ด๋ฆ์ ๊ฐ์ง ํ๋์ ๋ฌธ์ ๋ฌธ์์ด๊ณผ ๋ถ์กฐํ์ ์ผ์นํ๋ ๋ฌธ์ ๋ฌธ์์ด์ด ์๋ ํจ์ ์ฌ์ด์์ ๊ณตํต ์ ๋์ฌ๋ฅผ ์ฐพ์ผ์ญ๋๊น? ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์ผ๋ฐํ๋ฉ๋๊น? ์์ฃผ ์ ์ ์์ ํจํค์ง๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋ณต์กํ ํน๋ณํ ๊ฒฝ์ฐ์ฒ๋ผ ๋ณด์ ๋๋ค.
@rogpeppe ๊ทธ๊ฒ์
@nerdatmath ์ด๊ฒ์ ์ธ์ฝ๋ฉ/๋ฐ์ด๋๋ฆฌ(๋ ๋ค binary.ByteOrder๋ฅผ ๊ตฌํํจ)์ ๊ฒฝ์ฐ์ ๊ฐ์ด ๊ตฌ์ด์ฒด ์๋ฏธ์์ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๋ง Go ์๋ฏธ์์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ๋ณ์๋ ๋ค์์คํ์ด์ค์ฉ์ผ ๋ฟ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ godoc์ ์ ํ์ ๋ด๋ณด๋ด์ง ์๋ ํ ๋ฉ์๋(#7823)๋ฅผ ์ ํํ์ง ์์ต๋๋ค. ์ด๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ง์ ๋ถํฉ๋๋ค.
ํฌ๊ธฐ ์ ๋ฏธ์ฌ๋ ๊ด์ฐฎ์ง๋ง ๋์ฒด๋ก ๋ณ๋์ ํจํค์ง๋ฅผ ์ ํธํฉ๋๋ค. ํ์ง๋ง ์ด ๋๊ธ์ ์ง๋์น๋๋ก ๊ท์ฐฎ๊ฒ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
@nerdatmath๊ฐ var ์ด๋ฉด ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค( bits.Uint64 = bits.Uint8
ํ ์ ์์). ์ปดํ์ผ๋ฌ๊ฐ ํจํค์ง๋ฅผ (์ ์ด๋ ์ผ๋ถ) ํจํค์ง์ ๋ํ ๋๊ธฐ ์ค ํ๋์ธ ๋ด์ฅ ํจ์๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ๊ฒ ํฉ๋๋ค.
๋ณ์๊ฐ ๋ด๋ณด๋ด์ง์ง ์์ ์ ํ์ด๊ณ ์ํ๊ฐ ์๋ ๊ฒฝ์ฐ(๋ด๋ณด๋ด์ง ์์ ๋น ๊ตฌ์กฐ์ฒด) ๋ณ์๋ ์ค์ ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณตํต ์ธํฐํ์ด์ค๊ฐ ์์ผ๋ฉด godoc(์ค๋๋ )์ ๋์ฐํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ด ๋ต์ด๋ผ๋ฉด ๊ณ ์น ์ ์์ต๋๋ค.
ํ์ง๋ง ์ฌ๋ฌ ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋๋ผ๋ ์ด๋ฅผ ๋ณด์ฆํ๊ธฐ์ ์ถฉ๋ถํ ๋ฐ๋ณต๊ณผ ์์ด ์๋ค๋ฉด ์ต์ํ "X/bits/int64s", "X/bits/ints", "X/"์ ๊ฐ์ ํจํค์ง ์ด๋ฆ์ ์ง์ ํด์ผ ํฉ๋๋ค. "์ค๋ฅ", "๋ฌธ์์ด", "๋ฐ์ดํธ"์ ์ผ์นํ๋ ๋นํธ/int32s". ์ฌ์ ํ ๋ง์ ํจํค์ง ํญ๋ฐ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋จ์ผ ํจํค์ง ๋นํธ๋ฅผ ๊ฐ๋ ๊ฒ์ด ๊ฐ๋จํ๊ณ Go ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจํค์ง ์๋ฅผ ๋ถํ๋ฆฌ์ง ์๋ ์ฌ๋ฌ ์ ํ๋ณ ํจํค์ง ๊ฒฝ๋ก๋ก ์ด๋ํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
Ones64์ TrailingZeroes64๋ ์ข์ ์ด๋ฆ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ค์ ๊ทธ๋ค์ด ์นด์ดํธ๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์ ์๋ฆฌ์ง ์์ต๋๋ค. ์ ๋์ฌ Count๋ฅผ ์ถ๊ฐํ๋ฉด ์ด๋ฆ์ด ๋ ๊ธธ์ด์ง๋๋ค. ๋ด ํ๋ก๊ทธ๋จ์์ ์ด๋ฌํ ํจ์๋ ์ข ์ข ๋ ํฐ ํํ์์ ํฌํจ๋๋ฏ๋ก ์งง์ ํจ์ ์ด๋ฆ์ ๊ฐ๋ ์ฑ์ ๋์ ๋๋ค. "Hacker's Delight" ์ฑ ์ ์ด๋ฆ์ ์ฌ์ฉํ์ง๋ง Intel ์ด์ ๋ธ๋ฌ ๋๋ชจ๋์ธ Popcnt64, Tzcnt64 ๋ฐ Lzcnt64๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฆ์ ์งง๊ณ ์ผ๊ด๋ ํจํด์ ๋ฐ๋ฅด๋ฉฐ ์นด์ดํธ๊ฐ ๋ฐํ๋๊ณ ์ด๋ฏธ ์ค์ ๋์์์ ์๋ฆฝ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก Go์ ์นด์ดํธ๋ ์นด์ดํธ๊ฐ ์์๊ฐ ๋ ์ ์๋ ๊ฒฝ์ฐ์๋ int๋ก ๋ฐํ๋ฉ๋๋ค. ๋ํ์ ์ธ ์๋ ๋ด์ฅ ํจ์ len์ด์ง๋ง Read, Write, Printf ๋ฑ์ ๋ชจ๋ ์ ์๋ฅผ ๋ฐํํฉ๋๋ค. ์นด์ดํธ์ uint ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ๋๋ผ์ด ์ผ์ด๋ฉฐ int ๊ฐ์ ๋ฐํํ ๊ฒ์ ์ ์ํฉ๋๋ค.
์ ํ์ด (ํ๊ธฐ๋ฒ์ ๋จ์ฉํ๊ธฐ ์ํด) math/bits/int64s.Ones์ math/bits.Ones64 ์ค ํ๋๋ผ๋ฉด, ์ ๋ ํ์คํ ๋จ์ผ ํจํค์ง๋ฅผ ์ ํธํ ๊ฒ์ ๋๋ค. ํฌ๊ธฐ๋ณ๋ก ๋ถํ ํ๋ ๊ฒ๋ณด๋ค ํจํค์ง ์๋ณ์์ ๋นํธ๋ฅผ ํฌํจํ๋ ๊ฒ์ด ๋ ์ค์ํฉ๋๋ค. ํจํค์ง ์๋ณ์์ ๋นํธ๊ฐ ์์ผ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ์ ์ ์์ต๋๋ค. ์ด๋ ํจํค์ง ์ค๋ช ์์์ ๋ฐ๋ณต๋๋ ์ฌ์ํ ๋ถํธํจ๋ณด๋ค ๋ ์ค์ํฉ๋๋ค.
@ulikunitz ๋นํธ๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ๋ ์ฝ๋์์ ํญ์ ctz := bits.TrailingZeroes64
๋ฑ์ ์ํํ ์ ์์ต๋๋ค. ์ด๋ ์ ์ญ์ ์ผ๋ก ์์ฒด ๋ฌธ์ํ๋๋ ์ด๋ฆ๊ณผ ๋ณต์กํ ์ฝ๋์ ๋ํ ๋ก์ปฌ ์์ถ ์ด๋ฆ ์ฌ์ด์ ๊ท ํ์ ์ ์งํฉ๋๋ค. ๋ฐ๋ ๋ณํ์ธ countTrailingZeroes := bits.Ctz64
๋ ๋ฉ์ง ์ ์ญ ์์ฑ์ด ์ด๋ฏธ ์์ค๋์๊ธฐ ๋๋ฌธ์ ๋ ์ ์ฉํฉ๋๋ค.
๋๋ ์์ฃผ ๋๋ฌผ๊ฒ ๋นํธ ์์ค์์ ๋ฌผ๊ฑด์ ์๋ง์ผ๋ก ๋ง๋ญ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํด์ผ ํ๋ ๋ช ๋ ์ด ์ง๋ฌ๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ ์ด ํญ๋ชฉ์ ๋ง์ด ์ฐพ์๋ณด์์ผ ํฉ๋๋ค. ๊ทธ๋์ ๋ชจ๋ Hacker's Delight/asm ์คํ์ผ ์ด๋ฆ์ด ์ง์ฆ๋ ์ ๋๋ก ๋น๋ฐ์ค๋ฝ์ต๋๋ค. ์ฐจ๋ผ๋ฆฌ ๋ด๊ฐ ํ์ํ ๊ฒ์ ์ฐพ์ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๋์๊ฐ ์ ์๋๋ก ๊ทธ๊ฒ์ด ํ ์ผ์ ๋งํ์ผ๋ฉด ํฉ๋๋ค.
๋๋ @ulikunitz์ ๋์ํฉ๋๋ค. ๊ธด ์ด๋ฆ์ ๋์ด ์ํ
init() instead of initialize(),
func instead of function
os instead of operatingsystem
proc instead of process
chan instead of channel
๋ํ bits.TrailingZeroes64๊ฐ ์์ฒด ๋ฌธ์ํ๋๋ค๋ ์ ์ ๋์ ํ๊ณ ์ถ์ต๋๋ค. 0์ด ๋ค์ ์ค๋ ๊ฒ์ ๋ฌด์์ ์๋ฏธํฉ๋๊น? self documentation ์์ฑ์ ์ฌ์ฉ์๊ฐ ์ฒ์๋ถํฐ ๋ฌธ์์ ์๋ฏธ์ ๋ํด ์ด๋ ์ ๋ ์๊ณ ์๋ค๋ ๊ฐ์ ํ์ ์กด์ฌํฉ๋๋ค. ์ผ๊ด์ฑ์ ์ํด Hacker's Delight๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ RotateRight64 ๋ฐ RotateLeft64์ ์ผ์นํ๋๋ก ZeroesRight64 ๋ฐ ZeroesLeft64๋ผ๊ณ ๋ถ๋ฅด์ง ์๊ฒ ์ต๋๊น?
๋ช ํํ ํ์๋ฉด, ๋น์ ์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ ๋๋ง๋ค ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ ์งง์ ๋ณ์นญ์ ๋ง๋๋ ๊ฒ์ด๊ณ ์ฃผ์ด์ง ์ด๋ฆ์ ์ฌ์ฉํด์๋ ์๋๋ค๋ ๊ฒ์ ์์ํ๋ ค๋ ๊ฒ์ ์๋๋๋ค. ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ํฅ์๋๋ฉด ๋ณ์นญ์ ์ง์ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ด๊ฐ string.HasSuffix๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ ํ ๋ฒ ๋๋ ๋ ๋ฒ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ์ฃผ์ด์ง ์ด๋ฆ์ ๋๋ถ๋ถ ์ฌ์ฉํ์ง๋ง ๊ฐ๋์ ์ผํ์ฑ ETL ์คํฌ๋ฆฝํธ ๋ฑ์์ ๊ฒฐ๊ตญ์๋ ends := strings.HasSuffix
๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์งง๊ณ ์ฝ๋๋ฅผ ๋ ๋ช
ํํ๊ฒ ๋ง๋ค๊ฒ ์ต๋๋ค. ๋ณ์นญ์ ์ ์๊ฐ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ์ต๋๋ค.
์ถ์ฝ๋ ์ด๋ฆ์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ํญ๋ชฉ์ ์ ํฉํฉ๋๋ค. ๋ง์ ๋น ํ๋ก๊ทธ๋๋จธ๋ OS๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ์๊ณ ์์ต๋๋ค. Go๋ฅผ ๋ชจ๋ฅด๋๋ผ๋ ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋์ func๊ฐ function์ ์ฝ์๋ผ๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค. ์ฑ๋์ ๋ฐ๋์ ๊ธฐ๋ณธ์ด๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ chan์ ๊ด์ฐฎ์ต๋๋ค. ๋นํธ ๊ธฐ๋ฅ์ ์ ๋ ์ผ๋ฐ์ ์ด์ง ์์ต๋๋ค.
TrailingZeroes๋ ๊ฐ๋ ์ ์ต์ํ์ง ์์ ๊ฒฝ์ฐ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ํํ ๋งํ ์ ์์ ์๋ ์์ง๋ง Ctz๋ณด๋ค ์ ์ด๋ ๋๋ต์ ์ผ๋ก ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ํจ์ฌ ๋ ์ ์ ์ ์์ต๋๋ค.
@jimmyfrasche ๊ด๋ จ https://github.com/golang/go/issues/18616#issuecomment -275828661: go/doc์ด ๋ชจ๋ ๋ค์์ผ๋ก ์์ํ๋ ์ด๋ฆ์ ๊ฐ์ง ๋์ผํ ํ์ผ์ ์ฐ์์ ์ธ ๊ธฐ๋ฅ ์ํ์ค๋ฅผ ์ธ์ํ๋ ๊ฒ์ ๊ฝค ์ฌ์ธ ๊ฒ์ ๋๋ค. ๋์ผํ ์ ๋์ฌ๋ฅผ ๊ฐ์ง๋ฉฐ ์ผ๋ จ์ ์ซ์ ๋ฐ/๋๋ ์ ๋์ฌ์ ์๋์ ์ผ๋ก "์งง์" ๋จ์ด์ธ ์ ๋ฏธ์ฌ๋ฅผ ๊ฐ์ต๋๋ค. ์ด ํจ์ ์ค ์ฒซ ๋ฒ์งธ ํจ์์๋ง ๋ฌธ์ ๋ฌธ์์ด์ด ์๊ณ ์ ๋์ด๊ฐ ์ผ์นํ๋ ๋ค๋ฅธ ํจ์์๋ ๊ทธ๋ ์ง ์๋ค๋ ์ฌ์ค๊ณผ ๊ฒฐํฉํ ๊ฒ์ ๋๋ค. ๋ ์ผ๋ฐ์ ์ธ ์ค์ ์์ ๊ฝค ์ ์๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ์ด ์ ์์ ๊ฐ๋ก์ฑ์ง ์๊ธฐ ์ํด ๋ค๋ฅธ ๊ณณ์์ ๋ ผ์ํฉ์๋ค.
์ฐธ๊ณ ๋ก, go/doc
๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ๋
ผ์ํ๊ณ ํด๋น ๋ํ๋ฅผ ์ด ๋ํ์ ๋ณ๋๋ก ์ ์งํ๊ธฐ ์ํด #18858์ ๋ง๋ค์์ต๋๋ค.
@mdlayher ๊ทธ๋ ๊ฒ
@rogpeppe ํจํค์ง ์ด๋ฆ์ ํฌ๊ธฐ๋ฅผ ๋ฃ๋ ๊ฒ์ด ํฅ๋ฏธ๋กญ๊ฒ ๋ค๋ฆฌ์ง๋ง ๋๊ธ๊ณผ ๊ธฐ์กด Go ์คํ์ผ์ ๊ฐ์ํ ๋ ํจ์ ์ด๋ฆ์ผ๋ก ํฌ๊ธฐ๋ฅผ ๋ฃ๋ ๊ฒ์ด ๋
@ulikunitz ์ ๋ ๋ณดํต
Log2์ 2๊ฐ ํ์ํ์ง ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. bits.Log
๋ 2์ ๋ฐ์ ์๋ฏธํฉ๋๋ค.
๋นํธ.Log64 SGTM.
@griesemer ๋ด ์๋ฆฐ ๋ฌธ์ฅ์ ์๋ง๋ ์ํฌ๋ฅธ ํธ์ง์ ์ธ๊ณต๋ฌผ์ด์์ ๊ฒ์ ๋๋ค. ๋ฐฉ๊ธ ์ ๊ฑฐํ์ต๋๋ค.
@griesemer ๋ฐ์ดํฌ ์ ฐ๋ฉ ์ด๋ผ๋ ์ด๋ฆ์ ๊ณ์ ์ธ ๊ฐ์น๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์งง๊ฒ ์ ์งํ๋ค. ๋๋ ๋ ๊ฐ์ง ์ฃผ์ฅ์ด ์์๋ค: ์ซ์ ๋ฐํ์ ๋ํ ๊ฐ๊ฒฐํจ๊ณผ ๋ช ํ์ฑ. ํจํค์ง ๋น ์ ๋ด๋ถ์ ์ผ๋ก LeadingZeros๊ฐ ์๋ nlz๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉ ํ์๊ฐ ์ ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
@ulikunitz ์ฌ๊ธฐ ํผ๋๋ฐฑ์ ๋๋ถ๋ถ์ ๋ฐ๋ก ๊ฐ๊ธฐ๊ฐ ์๋ ๋ช ํํ ํจ์ ์ด๋ฆ์ ์ฐฌ์ฑํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ulikunitz , ์ถ๊ฐ๋ก:
ํจํค์ง ๋น ์ ๋ด๋ถ์ ์ผ๋ก LeadingZeros๊ฐ ์๋ nlz๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ด๋ณด๋ด์ง ์์ ๋ด๋ถ ๋น๊ณต๊ฐ ์ด๋ฆ์ ์ฌ๊ธฐ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
์ค์ํ ๊ฒ์ ๊ณต๊ฐ API์ ์ผ๊ด์ฑ๊ณผ ํ์ค ๋๋์ ๋๋ค.
Bikeshedding์ ์ฑ๊ฐ ์์ง๋ง ์ฐ๋ฆฌ๊ฐ ์์ํ ๋ถ์ด์์ ๋ ์ด๋ฆ์ ์ค์ํฉ๋๋ค.
CL https://golang.org/cl/36315์ ์ด ๋ฌธ์ ๊ฐ ์ธ๊ธ๋์ด ์์ต๋๋ค.
https://go-review.googlesource.com/#/c/36315/ ๋ฅผ ์ด๊ธฐ(๋ถ๋ถ์ ์ผ๋ก ํ ์คํธ๋) API(์๋น ๊ตฌํ ํฌํจ)๋ก ์ ๋ก๋ํ์ฌ ๊ฒํ ๋ฅผ ์ํด(๋์์ธ ๋ฌธ์ ๋์ )
API๊ฐ ์ฌ๋ฐ๋ฅธ์ง ๊ณ์ ํ์ธํ๊ณ ์์ผ๋ฏ๋ก ์ง๊ธ์ API(bits.go)์ ๋ํด์๋ง ์๊ฒฌ์ ๋งํด์ฃผ์ธ์. ์ฌ์ํ ๋ฌธ์ (์คํ ๋ฑ)๋ CL์ ๋๊ธ์ ๋จ๊ฒจ์ฃผ์ธ์. ๋์์ธ ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ด ๋ฌธ์ ์ ๋ํด ์๊ฒฌ์ ๋งํ์ญ์์ค. ์ธํฐํ์ด์ค์ ๋ง์กฑํ ๋๊น์ง CL์ ๊ณ์ ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.
ํนํ ๊ตฌํ์ ๋ํด ๊ฑฑ์ ํ์ง ๋ง์ญ์์ค. ๊ธฐ๋ณธ์ ์ด๋ฉฐ ๋ถ๋ถ์ ์ผ๋ก๋ง ํ ์คํธ๋์์ต๋๋ค. API์ ๋ง์กฑํ๋ฉด ๊ตฌํ์ ์ฝ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค.
@griesemer ๋๋ ๋น์ ์ด ๊ด์ฐฎ๋ค๊ณ ํ์ ํ์ง๋ง ์ ์ฉํ๋ค๋ฉด https://github.com/ericlagergren/decimal/tree/ba42df4f517084ca27f8017acfaeb69629a090fb/internal/arith ํ ์คํธ๊ฐ ํฌํจ๋ CLZ ์ด์ ๋ธ๋ฆฌ ๊ตฌํ์ด ์์ต๋๋ค. ํ์น๋ค / ๋ง์ง์๊ฑฐ๋ฆฌ๋ค / ๋ฌด์์ด๋ .
@ericlagergren ๋งํฌ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. API๊ฐ ์ค์ ๋๊ณ ๋ชจ๋ ๊ณณ์์ ํ ์คํธ๊ฐ ์ํ๋๋ฉด ๊ตฌํ ์ต์ ํ๋ฅผ ์์ํ ์ ์์ต๋๋ค. ๋ช ์ฌํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌ ํด์.
@griesemer , ์ ์ํ API ๋ฌธ์๋ go/doc์ด ์ ๋์ฌ๋ ๊ฐ์ง๋ง ์ ์ ์ ๋ฏธ์ฌ๊ฐ ์๋ ๊ธฐ๋ฅ์ ์ ์ ํ๊ฒ ๋ฌธ์ํํ ์ ์๋์ง์ ๋ฌ๋ ค ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
1.9 ์ด์ ์๋ ์์ ํ ๊ณํ์ ๋๊น?
@mdlayher ์ด์์ ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ API๊ฐ ์๋ "์ ์ผํ" ๋ฌธ์์๋ง ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ (์์ผ๋ก ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํด์ผ ํจ) ์ด๊ฒ์ ๋์ ๋์ง ์์ ๊ฒ์ ๋๋ค.
@griesemer @bradfitz ์๊ฐ์ ํ ์ ํ์ฌ ํจ์ ์ด๋ฆ์ ๋ํ ์ ์ ์ฅ์ ์ฌ๊ณ ํฉ๋๋ค. ์ด๋ฆ ์ ํ์ ์ค์ํ ๋ชฉํ๋ API๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์ ๊ฐ๋ ์ฑ ์ด์ด์ผ ํฉ๋๋ค.
๋ค์ ์ฝ๋๋ ์ค์ ๋ก ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
n := bits.LeadingZeros64(x)
๋๋ ์ฌ์ ํ Ones64(x)์ ๋ช ํ์ฑ์ ๋ํด ์ฝ๊ฐ ์์ฌ์ด ์์ง๋ง LeadingZeros ๋ฐ TrailingZeros์ ์ผ์นํฉ๋๋ค. ๊ทธ๋์ ๋๋ ๋ด ์ฌ๊ฑด์ ์ฌ๊ณ ํ์ฌ ์ ์์ ์ง์งํฉ๋๋ค. ์คํ์ผ๋ก ํ ์คํธ ์ผ์ด์ค๋ฅผ ํฌํจํ ํจํค์ง์ ์คํ์ ์ธ ์์ Go ๊ตฌํ์ ์ํด ๊ธฐ์กด ์ฝ๋๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
์ ์ฅ์: https://github.com/ulikunitz/bits
๋ฌธ์: https://godoc.org/github.com/ulikunitz/bits
Swap ํจ์ ์ธํธ๋ ์์ ์ ์์ต๋๋ค. [...] ๋๋ถ๋ถ์ SwapBytes ์ฌ์ฉ์ ์๋์์ ์ธ์ํ์ง ์์์ผ ํ ๋ ์๋์์ ์ธ์ํ๋ ์ฝ๋ ๋๋ฌธ์ ๋๋ค. ์ฝ๋ฉํธ?
์ด๋ฌํ ์ด์ ๋ก SwapBytes
๋ฅผ API์์ ์ ์ธํ๊ณ ์ถ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด binary/encoding.BigEndian
๋ณด๋ค ๋ ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์(๋๋ ๋ ๋น ๋ฅด๋ค๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์) ์ฌ๋๋ค์ด ํด๋์ฉ์ด ์๋ ๋ฐฉ์์ผ๋ก ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ธฐ ์์ํ ๊ฒ์ด๋ผ๊ณ ๊ฑฑ์ ํฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก SwapBytes๋ฅผ API์์ ์ ์ธํ๊ณ ์ถ์ต๋๋ค. ์ด์ง/์ธ์ฝ๋ฉ.BigEndian๋ณด๋ค ๋ ๊ฐ๋จ(๋๋ ๋ ๋น ๋ฅผ ๊ฒ์ผ๋ก ๊ฐ์ )ํ๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด ํด๋์ฉ์ด ์๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๊ธฐ ์์ํ ๊น๋ด ๊ฑฑ์ ๋ฉ๋๋ค.
@mundaym ์ด๋ฌํ ๋ฃจํด์ด SwapBytes64
๋ฅผ BSWAP
๋ก ์ง์ ์ปดํ์ผํ๊ฒ ํ๋ ๊ฒ์ด ๋ถ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ ์ฌ๋๋ค๋ณด๋ค ๋ ์ค์ํ ์ ์์ต๋๋ค.
๋ฐ์ด๋๋ฆฌ/์ธ์ฝ๋ฉ๋ณด๋ค ๋ ๊ฐ๋จ(๋๋ ๋ ๋น ๋ฅผ ๊ฒ์ผ๋ก ๊ฐ์ )ํ๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด ํด๋์ฉ์ด ์๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๊ธฐ ์์ํ ๊น๋ด ๊ฑฑ์ ๋ฉ๋๋ค.BigEndian
๋๋ ReverseBytes
์ฌ์ฉ์ด unsafe
์ ํจ๊ป ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์๋ง ์ด์์ฑ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์ ๊ธฐ๊ณ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์นํ๋ ๋ฐฉ์์ผ๋ก ๋ฎ์ ์์ค์์ ๋ฐ์ดํฐ์ ์ก์ธ์คํฉ๋๋ค. ๊ทธ๋ฌ๋ encoding.{Little,Big}Endian.X
๋ฅผ ๊ทธ๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์ด์์ฑ์ด ์์ต๋๋ค. ์์ถ์ ์ฌ์ฉํ ReverseBytes
๋ฅผ ๊ธฐ๋ํ๋ฉฐ ํฌํจ๋์ง ์์ผ๋ฉด ์ฌํ ๊ฒ์
๋๋ค.
@ericlagergren
์ด๋ฌํ ๋ฃจํด์ด ๋ด์ฌํ๋ ์์ ์ ๋๊น?
์, ๋ฐ์ดํธ ๋ฐ์ ์ ์ํํ๋ encoding/binary
์ ํจ์๋ ์ปดํ์ผ๋ฌ์์ ์ธ์ํ๊ณ ์ ๋ ฌ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ํ๋ ํ๋ซํผ์์ ๋จ์ผ ๋ช
๋ น์ด(์: BSWAP
)์ ์ต์ ํ๋(๋๋ ์ต์ ํ๋ ์ ์๋) ์ฝ๋ ํจํด์ ์ฌ์ฉํฉ๋๋ค. ์ก์ธ์ค(์: 386, amd64, s390x, ppc64le ๋ฐ ๊ธฐํ).
BSWAP๋ก SwapBytes64๋ฅผ ์ง์ ์ปดํ์ผํ๋ฉด ๋ถ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ ์ฌ๋๋ค๋ณด๋ค ๋ ์ค์ํ ์ ์์ต๋๋ค.
๋๋ ๋์ํ์ง ์๋ ๊ฒฝํฅ์ด ์๋ค. ์๋์์ ์ธ์ํ์ง ๋ชปํ๋ ์ฝ๋์์ SwapBytes
์ ํฉ๋ฒ์ ์ธ ์ฌ์ฉ์ด ์์ ์ ์์ง๋ง ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉ๋๋ ๊ฒ๋ณด๋ค ๋ ์์ฃผ ์ค์ฉ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
runtime/internal/sys์๋ ์ด๋ฏธ ์ต์ ํ๋ Go, ์ด์ ๋ธ๋ฆฌ ๋ฐ ํํ 0 ๋ฐ ๋ฐ์ดํธ ์ค์์ ์ปดํ์ผ๋ฌ ๋ด์ฅ ๋ฒ์ ์ด ์์ผ๋ฏ๋ก ์ด๋ฌํ ๊ตฌํ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
@dsnet ํฅ๋ฏธ
@aclements ๋ฐํ์์์ ๋ฐ์ดํธ ์ค์ ๋ด์ฅ ํจ์๊ฐ ์ฌ์ฉ๋๋ ์์น๋ฅผ ์๊ณ ์์ต๋๊น? ํ ์คํธ ์ด์ธ์ ์ฉ๋๋ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
@mundaym , AFAIK ๋ฐํ์์์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๋ด๋ถ API๋ ๊ทธ๋ ๊ฒ ์กฐ์ฌํ ํ์๊ฐ ์์ด์ ๊ทธ๋ฅ ctz ์ถ๊ฐํ ๋ ์ถ๊ฐํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐํ ๊ฒ ๊ฐ์์. :) (ํ์นด์ดํธ๊ฐ ๋ ๋์ ์ ํ์ด์์ ๊ฒ์ ๋๋ค.)
์ ์ฒด: ์ง๊ธ์ API์ ์ง์คํ๋ผ๋ ์๋ฆผ์ ๋๋ค. CL์์์ ๊ตฌํ์ ์ค์ ๋ก ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ํ ์คํธํ ์ ์๋๋ก ํ๋ ์ฌ์ํ๊ณ ๋๋ฆฐ ๊ตฌํ์ ๋๋ค. API์ ๋ง์กฑํ๋ฉด ๊ตฌํ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์ฐธ๊ณ : uint32
๋๋ uint64
์ ํฌ๊ธฐ๊ฐ ๊ฐ๋ค๋ ๋ณด์ฅ์ด ์๊ธฐ ๋๋ฌธ์ uintptr
๋ฒ์ ์ ํฌํจํด์ผ ํฉ๋๋ค. (๋จ์๋ ํญ์ uint32
๋๋ uint64
). ์๊ฒฌ? ๋์ค์ ์ํด ๋จ๊ฒจ๋์๊ฒ ์ต๋๊น? ์ข์ ์ด๋ฆ์ ๋ฌด์์
๋๊น? ( LeadingZerosPtr
?).
์ง๊ธ uintptr์ ์ํํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด math/big์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ๋ฏธ์ฌ Ptr
SGTM. uint
๋ ์ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ชจ๋ ํธ์ถ ์ฝ๋๊ฐ ๋ณํ ์๋ ํธ์ถ์ ๋ง๋ค๊ธฐ ์ํด int ํฌ๊ธฐ ์ฃผ์์ ์กฐ๊ฑด๋ถ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๋ค์ด๋ฐ ์์ด๋์ด๊ฐ ์์ต๋๋ค.
uintptr์ ๊ฒฝ์ฐ Ptr, uint์ ๊ฒฝ์ฐ ์ ๋ฏธ์ฌ๊ฐ ์์ต๋๋ค. Ones, Ones8, Ones16, Ones32, Ones64, OnesPtr ๋ฑ
์ ๋ ์์์ผ ์๋ ์์ง๋ง uintptr์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐ๋ํฉ๋๋ค.
math/big์ ์ฒ์๋ถํฐ uint32/uint64๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. (์ฌ์ค ๋๋
๋ชจ๋ ์ํคํ
์ฒ์ uint64๋ฅผ ์ฌ์ฉํ๊ณ ์ต์ ํ๋
์ปดํ์ผ๋ฌ.)
๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
math/big์ ์ต์ ์ ์ฑ๋ฅ์ ์ํด ๊ธฐ๋ณธ ๋จ์ด ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ซํ ์๋ ๋์ uintptr์ ์ฌ๋ฐ๋ฅธ ์ ํ์ด ์๋๋๋ค.
ํฌ์ธํฐ์ ํฌ๊ธฐ๊ฐ ํฌ์ธํฐ์ ํฌ๊ธฐ์ ๊ฐ๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค.
๋ค์ดํฐ๋ธ ๋จ์ด ํฌ๊ธฐ.
๋ํ์ ์ธ ์๋ amd64p32์ด๋ฉฐ mips64p32๋ฅผ ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
mips64p32le ๋์ค์, 64๋นํธ MIPS ํธ์คํธ์ ํจ์ฌ ๋ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
๋๋ ํ์คํ ๊ทธ๋ฌํ ์ฌ์ฉ์ ๋ ๊ถ์ฅํ๊ณ ์ถ์ง ์์ต๋๋ค. uintptr์ ๊ฐ์ฅ
์ํคํ
์ฒ ์ค๋ฆฝ ์ ์๊ฐ ์๋ ํฌ์ธํฐ์ ๊ฒฝ์ฐ.
๊ทธ๋ฌ๋ ํ ๊ฐ์ง ํด๊ฒฐ์ฑ
์ API์ ์ ํ ๋ณ์นญ์ ๋์
ํ๋ ๊ฒ์
๋๋ค(์๋ง๋
๋ธ๋๋ ์ ํ์ด์ด์ผ ํ๋ฉฐ ์ด๋ ๋
ผ์ ๋์์
๋๋ค.)
type Word = uint32 // ๋๋ 64๋นํธ ์ํคํ
์ฒ์ ๊ฒฝ์ฐ uint64
// Word์ ๋ค์๊ณผ ๊ฐ์ ์ด์์ ์ธ ์์๋ฅผ ๋ช ๊ฐ์ง ์ ๊ณตํด์ผ ํ ์๋ ์์ต๋๋ค.
๋นํธ ์, ๋ง์คํฌ ๋ฑ
๊ทธ๋ฐ ๋ค์ Word๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ ํ ์ ๋์ฌ ์์ด ํจ์๋ฅผ ๋์ ํฉ๋๋ค.
์ฌ์ค, ์ํ/๋นํธ๊ฐ ๋ ๊ฐ์ง ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ฉด add, sub, mul,
div; math/big์ ์ํคํ
์ฒ๋ณ ์ด์
๋ธ๋ฆฌ ์์ด ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
์ํ/ํฐ ์์ถ type Word uintptr
. ๋๋ ๊ทธ๊ฒ์ด ์ค์ ์ผ ์ ์๋ค๋ ๋ฐ ๋์ํ์ง๋ง ํธํ์ฑ์ ์ํด์๋ ๊ทธ๊ฒ์ด ๋จ์ ์์ด์ผํ๋ค๊ณ ๋ฏฟ์ต๋๋ค. ๋ฐ๋ผ์ ์ํ/๋นํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ/๋น
์ ๊ตฌํํ๋ ค๋ฉด uintptr API๊ฐ ํ์ํฉ๋๋ค.
์ฃผ์ ์์ ์ฝ๊ฐ ๋ฒ์ด๋์ง๋ง ๊ธฐ๋ณธ ๋ถํธ ์๋ ๋จ์ด ํฌ๊ธฐ๋ uint๊ฐ ์๋๊ฐ์? ์ด ๊ฒฝ์ฐ uint์ ๋ํ ์ ๋ฏธ์ฌ๊ฐ ์๋ ๊ฒ์ด ๋ง๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋จ์ผ ์ ํ์ธ Word๊ฐ ๋ค๋ฅธ ์ํคํ ์ฒ์์ ๋ค๋ฅธ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ํธ์ถ์์ ๋ฌธ์์ ๋ง์ ๋ณต์ก์ฑ์ ๋์ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๊ธฐ์กด ์ ํ์ ๊ณ ์ํ๋ค๋ ๊ฒ์ ๋จ์ํ ์ฌ์ฉํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ํคํ ์ฒ์ ๋ฐ๋ผ ์ ํ์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ํด๋น ์ ํ์ ์ค์ฌ์ผ๋ก ๋ชจ๋ ์ฝ๋๋ฅผ ์ค๊ณํ๊ฑฐ๋ ๋น๋ ํ๊ทธ ๋ณดํธ ํ์ผ์ ์ด๋ํฐ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
FWIW, math/big ๊ตฌํ์ ์ฌ์ ํ โโuint32/64 ๊ธฐ๋ฐ ๋นํธ API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค(ํจ์์ uintptr ๋ฒ์ ์ด ์๋ ๊ฒฝ์ฐ).
@minux ์ ๋ 2-result add,sub,mul,div์ ๋ฐ๋ํ์ง ์์ต๋๋ค. ํ์ง๋ง ๋ ๋ฒ์งธ ๋จ๊ณ์์ ๊ทธ๋ ๊ฒ ํฉ์๋ค. ๊ทธ๋๋ ๊ด์ฐฎ์ ์ฑ๋ฅ์ ์ํ๋ค๋ฉด ์ด์ ๋ธ๋ฆฌ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ปดํ์ผ๋ฌ์ ์ํด ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ ํ๊ฒ๋์ด ๊ธฐ์ฉ๋๋ค ...
API์ uint ๋ฐ uintptr ๋ฒ์ ์ ์ถ๊ฐํ์ต๋๋ค. CL์ ๋ณด๊ณ ๋๊ธ์ ๋ฌ์์ฃผ์ธ์. ๊ทธ๋ฌ๋ ๊ธฐ๋ฅ์ ํ์ฐ์ ๋๋ฌด ๋ง์กฑํ์ง ์์ต๋๋ค.
@josharian ๊ธฐ๋ณธ ๋จ์๋ 64๋นํธ ์์คํ ์์๋ 32๋นํธ ๊ฐ์ผ ์ ์์ต๋๋ค. ๋ณด์ฅ์ด ์์ต๋๋ค. ๋๋ uintptr์ด ๊ธฐ๊ณ์ด ํฌ๊ธฐ๋ ๋ณด์ฅํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋น์์๋ ๋์ด์ผ ๋ณด๋ฉด ๊ทธ๊ฒ์ด ํ๋ ธ๋ค๋ฉด ๋ ํฉ๋ฆฌ์ ์ธ ์ ํ์ฒ๋ผ ๋ณด์์ต๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ ์ ๋ง๋ก Word ์ ํ์ด ํ์ํฉ๋๋ค.
uintptr ํจ์์ ๋ํ ์ ์ผํ ํฉ๋ฒ์ ์ธ ํ์๊ฐ math/big์ ์ง์ํ๋ ๊ฒ์ด๋ผ๋ฉด math/bits์ ๊ตฌํ์ ๋ด๋ถ ํจํค์ง์ ๋ค์ด๊ฐ ์ ์์ต๋๋ค. math/big์์ uintptr ํญ๋ชฉ๋ง ์ฌ์ฉํ๊ณ ๋๋จธ์ง๋ ๋ ธ์ถํ์ญ์์ค.
@jimmyfrasche , @griesemer ๊ทธ๊ฒ big.Int.Bits์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ๊น์? ์ฆ, ์ฌ์ ํ ์ ๋ก ํ ๋น์ด ๋ ๊น์?
uint๋ ์๋ชป๋์์ต๋๋ค. amd64p32์์ 32๋นํธ์
๋๋ค.
์ค์ ๋ก math/big์ uintptr ๋์ uint๋ฅผ ์ฌ์ฉํ ์ ์์์ง๋ง Go 1์์๋
int/uint๋ ํญ์ 32๋นํธ์ด๋ฏ๋ก uintptr์ด ๊ฐ๋ฅํ ์ ์ผํ ์๋ฃจ์
์
๋๋ค.
์ํ/big.Word.
์ฐ๋ฆฌ๋ ์๋ก์ด ํจํค์ง๋ฅผ ์ค๊ณํ๊ณ ์์ผ๋ฏ๋ก ํธํ์ฑ์ด ๊ทธ๋ค์ง ์ค์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ ค. math/big์ ์๋ชป๋ ์ ํ์ ์ฌ์ฉํ๊ณ ์์ง๋ง ์ด๋ ์ญ์ฌ์
์ฌ๊ณ . ๋ ์ด์ ์ค์ํ์ง ๋ง์๋ค.
ํญ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํตํฉ ์ ํ "Word"๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
์ฃผ์ด์ง ์ํคํ
์ฒ์ ๋ํ ํจ์จ์ ์ธ ์ ์ ์ ํ์ ๋ค์๋ณด๋ค ๋ ๋ณต์กํฉ๋๋ค.
uintptr์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ฝ๋์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๋งค์ง ์ ํ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ํคํ
์ฒ์ ๋ฐ๋ผ 32๋นํธ ๋๋ 64๋นํธ์
๋๋ค. ์ธ ์ ์๋ค๋ฉด
uintptr(๋๋น๋ ์ํคํ
์ฒ์ ๋ฐ๋ผ ๋ค๋ฆ)์ ์ฌ์ฉํ๋ ์ฝ๋
์ํคํ
์ฒ์ ๋
๋ฆฝ์ ์ธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Word์์๋ ๋์ผํ ์์
์ ์ํํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Word๋ ๋ชจ๋ ์ํคํ
์ฒ์์ ์ ํํฉ๋๋ค.
API์ ํ์ฐ์ ์ํด 8์ ๋ํ ๊ธฐ๋ฅ์ ์๋ตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฐ ์ฒซ ๋ฒ์งธ ํจ์ค์ 16๋นํธ ์ ํ. ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ ๋๋ถ๋ถ
์ํคํ
์ฒ๋ ์ด์จ๋ 32๋นํธ ๋ฐ 64๋นํธ ๋ช
๋ น์ด๋ง ์ ๊ณตํฉ๋๋ค.
math/big์ Word๋ฅผ ์ ์ํ๊ณ ๋ด๋ณด๋ด์ง๋ง a) uintptr๊ณผ ์ง์ ํธํ๋์ง ์๊ณ (๋ค๋ฅธ ์ ํ์) b) Word๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํ๊ณ ๊ตฌํ์ ๋ํด ๊ฐ์ ํ์ง ์๋ ์ฝ๋๋ ๋ชจ๋ ์ข ๋ฅ์ Word ๊ตฌํ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. . ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. API ํธํ์ฑ ๋ณด์ฅ์ ์ํฅ์ ๋ฏธ์น๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค(์๋ํ์ง๋ ์์์ต๋๋ค). ์ด์จ๋ , ์ด๊ฒ์ ์ ์ณ๋๊ณ ๊ฐ์. ๋ณ๋๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ช ์์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ์ง์ ๋ ๋ชจ๋ uint ์ ํ์ ๊ฐ๋จํ ์ํํ ์ ์์ต๋๊น? uint/uintptr ํฌ๊ธฐ๋ฅผ ์์๋ก ์๊ณ ์๋ค๋ฉด ์ฌ๋ฐ๋ฅธ ํฌ๊ธฐ์ ํจ์๋ฅผ ํธ์ถํ๋ if ๋ฌธ์ ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. if ๋ฌธ์ ์ผ์ ํ๊ฒ ์ ํ ์๊ณ ๊ฐ ๋ํผ ํจ์๋ ๋จ์ํ ์ธ๋ผ์ธ๋ ํฌ๊ธฐ๊ฐ ์ง์ ๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, Word ์ ํ(์ํ/๋ํ๊ณผ ๋ฌด๊ด)๊ณผ ๊ด๋ จ๋ ์ฌ๋ฐ๋ฅธ ์๋ฃจ์ ์ ๋ฌด์์ ๋๊น? ๋ฌผ๋ก ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ํ/๋นํธ๋ก ์ ์ํ ์ ์์ง๋ง ๊ทธ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์ฅ์์ ๋๊น? ํ๋ซํผ๋ณ ์ ํ์ ๋๋ค. ๋ฏธ๋ฆฌ ์ ์ธ๋ '๋จ์ด' ์ ํ์ด์ด์ผ ํฉ๋๊น? ๊ทธ๋ฆฌ๊ณ ์ ์๋์ง?
์ฌ๊ธฐ์ uintptr์ ์ง์ ์ธ๊ธํ๋ ํจ์ ์๋ช (๋๋ ์ด๋ฆ)์ด ์๋ ๊ฒ์ ์ค์์ฒ๋ผ ๋ณด์ ๋๋ค. ์ฌ๋๋ค์ Go ํฌ์ธํฐ์์ ์ด๋ฐ ์ข ๋ฅ์ ๋นํธ๋ฅผ ์กฐ์ํด์๋ ์ ๋ฉ๋๋ค.
์์ฐ์ด ์ ํ์ ๋ํ ๊ธฐ๋ฅ์ด ์์ด์ผ ํ๋ค๋ฉด ์ด์ int/uint๋ฅผ ์ฐธ์กฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ 64๋นํธ ์์คํ ์์ 32๋นํธ์๊ธฐ ๋๋ฌธ์ ์ํ/ํฐ์์ uint๋ฅผ ์ฌ์ฉํ์ง ์์์ง๋ง ๊ทธ ์ดํ๋ก ์์ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ math/big์ ์์ฒด์ ์ผ๋ก ์ผ๊ด๋ ์ธ๊ณ์ด์ง๋ง big.Word ์์ฒด ์ ํ์ ๊ฐ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค. ์ด ํจํค์ง๋ ์ ํ ๋ฐ ์ ํ ์ ํธ๋ฆฌํฐ ๋ฃจํด์ ๋ชจ์์ ๋๋ค. ์ด ์ปจํ ์คํธ์์ ์ ์ ํ์ ์ ์ํ๋ ๊ฒ์ ๋ ๋งค๋ ฅ์ ์ ๋๋ค.
int/uint ๋ณํ์ด ํ์ํ์ง ์ฌ๋ถ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ ์ด ํจํค์ง์์ ์ ์ํ๋ ๊ฒ์ด ๋ชจ๋ ํธ์ถ์๊ฐ if ๋ฌธ์ ์์ฑํ๋๋ก ๊ฐ์ ํ๋ ๊ฒ๋ณด๋ค ๋ ํฉ๋ฆฌ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ๋ค์ด ์ผ๋ฐ์ ์ผ๋ก ํ์ํ ์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
math/big๊ณผ์ ์ ์ฌ์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๊ธฐ API์์ uintptr์ ์ธ๊ธํ์ง ์๋ ์๋ฃจ์ ์ด ๋ ๊ฐ ์ด์ ์์ต๋๋ค.
๋น๋ ํ๊ทธ์ ์ ์ ํ๊ฒ ๋ฆฌ๋๋ ์ ๋๋ uintptr ํ์ฉ ๋ํผ๋ฅผ ์ฌ์ฉํ์ฌ math/big์์ word32.go ๋ฐ word64.go ํ์ผ์ ์ ์ํ๊ณ ์ปดํ์ผ๋ฌ ์ธ๋ผ์ธ์ด ์ฌ๋ฐ๋ฅธ ์์ ์ ์ํํ๋์ง ํ์ธํฉ๋๋ค.
big.Word์ ์ ์๋ฅผ uint๋ก ๋ณ๊ฒฝํฉ๋๋ค. ์ ํํ ์ ์๋ API์ ๋ ธ์ถ๋์ด ์์ด๋ ๋ด๋ถ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ณ๊ฒฝํ๋ฉด amd64p32๋ฅผ ์ ์ธํ๊ณ ๋ ์ด๋ค ์ฝ๋๋ ๊นจ๋จ๋ฆด ์ ์์ผ๋ฉฐ, ์ฌ์ง์ด ์ํ/ํฐ ์ธ๋ถ์์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
@rsc : "64๋นํธ ์์คํ ์์ 32๋นํธ์๊ธฐ ๋๋ฌธ์ ์ํ/big์์ uint๋ฅผ ์ฌ์ฉํ์ง ์์์ง๋ง ์ดํ๋ก ์์ ํ์ต๋๋ค. " ์ ์, uintptr์ ์ ํํ ์ด์ ๋ฅผ ์์ ํ ์์์ต๋๋ค. Go uint/int ์ ํ์ ์์ ์ ๊ธฐ๊ณ์ ์์ฐ ๋ ์ง์คํฐ ํฌ๊ธฐ๋ฅผ ๋ฐ์ํ๋ ์ ์ ์ ํ์ ๊ฐ๋ ๊ฒ์ ๋๋ค. ๋๋ ํฐ ๋ณํ๋ฅผ ์๋ํ ๊ฒ์ด๋ค.Word๋ฅผ uint๋ก ๋ฐ๊พธ๊ณ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ๋ณด์.
์ ์ฒด: ์์ ๋ ผ์์ ๋ฐ๋ผ uintptr ํจ์ ๋ฒ์ ์ ์ ์ธํ๋๋ก https://go-review.googlesource.com/#/c/36315/ ๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค.
ํจ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ํด math/bits๋ฅผ ์ฌ์ฉํ๋๋ก math/big์ ์ ์ ์ ์ผ๋ก ์ ๋ฐ์ดํธํ์ต๋๋ค(https://go-review.googlesource.com/36328).
๋ช ๊ฐ์ง ์๊ฒฌ:
1) ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋์ชฝ์ผ๋ก ๊ธฐ์ธ๊ณ ์์ด์ Leading
/ TrailingZeros
๊ธฐ๋ฅ uint
๋ณด๋ค๋ int
. ์ด๋ฌํ ๊ฒฐ๊ณผ๋ ๊ทธ์ ๋ฐ๋ผ ๊ฐ์ ์ด๋ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. math/big
๊ฐ ์ด๋ฅผ ์ฆ๋ช
ํฉ๋๋ค. ๋ํ ์ผ๊ด์ฑ์ ์ํด Ones
๊ฐ uint
๋ฐํํ๋๋ก ํ๋ ๊ฒ์ ์ฐฌ์ฑํฉ๋๋ค. ๋ฐ๋ ์ฃผ์ฅ?
2) ๋๋ One
๋ผ๋ ์ด๋ฆ์ ํฌ์ด ์๋์ง๋ง Leading
/ TrailingZeros
์ ์ผ์นํฉ๋๋ค. Population
์ด๋ป์ต๋๊น?
3) ์ด๋ค ์ฌ๋๋ค์ Log
๊ฐ ์ด ํจํค์ง์ ๋ง์ง ์๋๋ค๊ณ ๋ถํํ์ต๋๋ค. Log
๋ msb์ ์ธ๋ฑ์ค์ ๋์ผํฉ๋๋ค(x == 0์ ๊ฒฝ์ฐ -1 ์ฌ์ฉ). ๋ฐ๋ผ์ MsbIndex
๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๋ค(Log๊ฐ ๋ ์ข์ ๋ณด์ด์ง๋ง). ๋๋ x์ ๊ธธ์ด(๋นํธ)์ธ Len
ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฆ, `Log(x) == Len(x)-1).
์ฝ๋ฉํธ?
๋๋ Leading/TrailingZeros์ ์ผ์นํ์ง๋ง One์ด๋ผ๋ ์ด๋ฆ์ ํฌ์ ์๋๋๋ค. ์ธ๊ตฌ๋ ์ด๋ป์ต๋๊น?
๊ธฐ์กด์ Popcount
์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๋๋ x์ ๊ธธ์ด(๋นํธ)์ธ Len ํจ์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ฆ, `Log(x) == Len(x)-1).
Len
๋๋ Length
์ข์ ์ด๋ฆ๊ณผ ์ข์ ์๊ฐ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
1.
๋๋ One์ด๋ผ๋ ์ด๋ฆ์ ํฌ์ด ์๋์ง๋ง Leading/
ํํ์ ๋ก. ์ธ๊ตฌ๋ ์ด๋ป์ต๋๊น?
๋นํธ.์นด์ดํธ?
@aclements ๋ฌด์์
Population์ ์ญ์ฌ์ ์ด์ ๋ก ๋ ๋์ ์ด๋ฆ์ผ ์ ์์ง๋ง ์ฉ์ด์ ์ต์ํ์ง ์๊ณ ๋์ผํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ Ones๋ณด๋ค ๋ ๋ง์ด ๋งํ์ง๋ ์์ต๋๋ค. Count: Population of what?
ํจํค์ง ๋ด์์๋ ๋ค์ ๋จ์กฐ๋กญ์ง๋ง ๋ช ํํ๊ณ ๋ถ๋ช ํ ์ด๋ฆ์ ์ง์ ํ๊ธฐ ์ํด CountOnes๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@aclements ๋ฌด์์
"bits"๋ผ๋ ํจํค์ง์์ ์ธํธ ๋นํธ๋ฅผ ์ ์ธํ๊ณ ๋ฌด์์ ์
์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง CountOnes๋ ํ๋ฅญํ๊ณ ๋ถ๋ช
ํ ๋ ๋ช
์์ ์
๋๋ค. "1"์ ์ถ๊ฐํ๋ ๊ฒ์ LeadingZeros
/ TrailingZeros
์ "0"๊ณผ๋ ์ ์ฌํฉ๋๋ค.
๊ฐ์ฅ ๋ถ๋ช ํ ํด์์ด์ง๋ง ์ฌ์ ํ ๋ชจํธํฉ๋๋ค. ์ค์ ๋์ง ์์ ๋นํธ ๋๋ ์ด ๋นํธ ์๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค(๋ง์ง๋ง ํด์์ ๊ทนํ ๋๋ฌผ์ง๋ง ๊ด๋ จ๋ ๊ฐ๋ ์ ์ต์ํ์ง ์๊ณ ์ ๋ฏธ์ฌ๊ฐ ์๋ Count๊ฐ ์์ ํ์ง ์๋ค๊ณ ์๊ฐํ ์ ์๋ ๋นํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋์๊ฒ๋ ์ฌ์ ํ ์ ์ฌ์ ์ธ ํจ์ ์ ๋๋ค.SizeOf)
Trailing/LeadingZeroes๋ฅผ ๋ฏธ๋ฌ๋งํ๋ AllOnes ๋๋ TotalOnes์ ๊ฐ์ ๊ฒ์ผ ์ ์์ง๋ง ์ด์๋ ๋ฌ๋ฆฌ ์์น๊ฐ ๊ณ ๋ ค๋์ง ์๋๋ก ์ง์ ํฉ๋๋ค.
AllOnes๋ ๋ชจ๋ ๊ฒ์ ๋ฐํํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
CountOnes์ TotalOnes๋ ๊ฑฐ์ ๊ฐ์ ๊ฒ ๊ฐ์ง๋ง ์ด ์์ ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์๋ ค์ง ์ด๋ฆ์ด "population count"์ด๊ธฐ ๋๋ฌธ์ CountOnes๊ฐ ๋ ๋ฐ๋์งํ ๊ฒ ๊ฐ์ต๋๋ค.
๋ช ๊ฐ์ง ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋ ์ ๋ฒ์ (https://go-review.googlesource.com/#/c/36315/)์ ์ ๋ก๋ํ์ต๋๋ค.
1) Ones
์ PopCount
. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ผ๊ด์ฑ์ด ์์ง๋ง ๋ค์ ๋จ์กฐ๋ก์ด Ones
์ด๋ฆ์ ๋ํด ๊ทธ๋ค์ง ํฅ๋ถํ์ง ์์์ต๋๋ค. ์ด ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ค๋ ๋ชจ๋ ์ฌ๋์ PopCount
๊ฐ ํ๋ ์ผ์ ์ ํํ ์ ๊ฒ์
๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ฅด๋ ์ด๋ฆ์
๋๋ค. ๋๋จธ์ง ๋ถ๋ถ๊ณผ ์ฝ๊ฐ ์ผ์นํ์ง ์์ง๋ง ์๋ฏธ๊ฐ ํจ์ฌ ๋ช
ํํด์ก์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๋ํด Ralph Waldo Emerson๊ณผ ํจ๊ป ํ ๊ฒ์
๋๋ค("์ด๋ฆฌ์์ ์ผ๊ด์ฑ์ ์์ ๋ง์์ ํ๊ณ ๋ธ๋ฆฐ์
๋๋ค...").
2) bits.Len
์์์ ๊ฐ์ด Log
๋ฅผ Len
๋ก ๋ณ๊ฒฝํ์ต๋๋ค. ์ซ์ x์ ๋นํธ ๊ธธ์ด๋ x๋ฅผ ์ด์ง ํํ์ผ๋ก ๋ํ๋ด๋ ๋ฐ ํ์ํ ๋นํธ ์์
๋๋ค(https://en.wikipedia.org/wiki/Bit-length). ์ ์ ํด ๋ณด์ด๋ฉฐ "์กฐ๊ธ ๊น๋ค๋ก์ด" ํ์ง์ด ์๋ Log
๊ฐ ํ์ํ์ง ์์ต๋๋ค. Log
์ ์๋ ๋ฐฉ์์ ๊ฐ์ํ ๋ Len(x) == Log(x) + 1
์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋ํ ์น๋ฆฌ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ๊ฒฐ๊ณผ๊ฐ ํญ์ >= 0์ด๊ณ (์ฌ์ํ) ๊ตฌํ์์ ์ผ๋ถ +/-1 ์์ ์ ์ ๊ฑฐํ๋ค๋ ์ด์ ์ด ์์ต๋๋ค.
์ ๋ฐ์ ์ผ๋ก ์ด ์์ ์์ ์ด API์ ๋งค์ฐ ๋ง์กฑํฉ๋๋ค(๋์ค์ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์). ์ฐ๋ฆฌ๊ฐ ์ง์งํ๊ฒ ๊ณ ๋ คํ๊ณ ์ถ์ ์ ์ผํ ๋ค๋ฅธ ๊ฒ์ ๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ ์๋ช ๋์ง ์์์ผ ํ๋์ง ์ฌ๋ถ์ ๋๋ค. ์ด์ ์ ์ง์ ํ๋ฏ์ด Trailing/Leading Zero ํจ์ ๊ฒฐ๊ณผ๋ ๋ถํธ๊ฐ ์์ด์ผ ํ๋ ์ํํธ ์ฐ์ฐ์ ๋ํ ์ ๋ ฅ์ธ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ด๋ ํ๋ฆผ์์ด ๋ถํธ ์๋ ๊ฐ๋ ๋ฐํํ ์ ์๋ Len ๋ฐ PopCount๋ง ๋จ๊ฒ ๋ฉ๋๋ค.
์ฝ๋ฉํธ?
์ํ/big์ ๋ํ ๋ด ๊ฒฝํ์ ๋ด๊ฐ ์ด๋ํ์ง ์์ ๋ ํจ์์ ์ํด uint ๋ชจ๋๋ก ๊ฐ์ ์ ํ๋๋ ๊ฒ์ ๋ํ ์ข์ ๊ฐ์ด์์ต๋๋ค. math/big/prime.go์์ ๋๋ ์ผ์ต๋๋ค.
for i := int(s.bitLen()); i >= 0; i-- {
s.bitLen()์ด uint๊ฐ ์๋ int๋ฅผ ๋ฐํํ๋๋ผ๋ ๋๋ ๋ณด์ง ์๊ณ ํ์ ํ ์ ์์๊ณ ๋ฏธ๋์ CL์ด uint๋ฅผ ๋ฐํํ๋๋ก ๋ณ๊ฒฝํ์ง ์์ ์๋ ์๋ค๋ ํ์ ์ด ์์๊ธฐ ๋๋ฌธ์ for ๋ฃจํ๋ฅผ ๋ฌดํ ๋ฃจํ๋ก ๋ฐ๊ฟ๋๋ค. ์ด๋ฌํ ๋ฐฉ์ด๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์์์ ์์ฌํฉ๋๋ค.
Uint๋ int๋ณด๋ค ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ํจ์ฌ ๋๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ API์์ ๊ถ์ฅํ์ง ์์ต๋๋ค. ์ด์จ๋ ๋๋ถ๋ถ์ ์ํํธ ํํ์์์ ํ์ํ ๊ฒ์ฒ๋ผ ์ํ/๋นํธ์ ๋ชจ๋ ํจ์๊ฐ int๋ฅผ ๋ฐํํ๊ณ ๋ณํ์ ์ํํธ ํํ์์์ ์ํํ๋๋ก uint๋ก ๋จ๊ฒจ๋๋ฉด ํจ์ฌ ๋ ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
(๋ณ๊ฒฝ์ ์ ์ํ๋ ๊ฒ์ ์๋์ง๋ง uint๋ฅผ ์๊ตฌํ๋ shift๊ฐ ๋์ด์ผ๋ณด๋ฉด ์ค์์์ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ธ์ ๊ฐ๋ ๊ณ ์น ์ ์์ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ API์ ํผํด๋ฅผ ์ฃผ์ง ์๋๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.)
๋๋ ํํ 0 ๋ฐ popcount ํจ์ ํธ์ถ์ ๋ํด ๋ด ์ฝ๋๋ฅผ greppingํ ํ int ๋ฐํ์ ์ง์ํฉ๋๋ค. ๋๋ถ๋ถ์ ํธ์ถ์ ์งง์ ๋ณ์ ์ ์ธ๊ณผ int ์ ํ์ ๋น๊ต์ ์์ต๋๋ค. ๊ต๋ ํธ์ถ์๋ ๋ฌผ๋ก uint ์ ํ์ด ํ์ํ์ง๋ง ๋๋๊ฒ๋ ๋๋ญ ๋๋ค.
์ฝ๊ฐ์ ์กฐ์ ์ ์
๋ก๋ํ์ต๋๋ค. +1 ๋ฐ ๋๊ธ์ ๋ฐ๋ผ counts์ ๊ฒฐ๊ณผ๋ฅผ int
๋ก ๋ก๋๋ค.
https://go-review.googlesource.com/36315
๋๋์ ๋ํ ์
๋ ฅ ์นด์ดํธ ์ผ์ชฝ RotateLeft/Right
๋ก uint
, ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฐ๋ฆฌ๋ ๊ฐ์ด ํ์ฉ ์ ๊ทธ๊ฒ์ ๋ถ์ ํ๊ฑฐ๋ ๋ ๋ฐ์ํ๋ ์ง์ ํด์ผํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ฐ๋ฆฌ๋ ์ฌ์ง์ด ๋ฉ๋ฆฌ ๋ ๋ ์ Len
์ดํ์ ๋ชจ๋ ํ LenN(x) == N - LeadingZerosN(x)
. ์๊ฒฌ?
์ด ์์ ์์ ๋ ์ด์ ์ค์ํ ํผ๋๋ฐฑ์ด ์์ผ๋ฉด ์ด API๋ก ์งํํ๊ณ ๊ฒํ ํ ์ด๊ธฐ ๊ตฌํ์ ์ปค๋ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ตฌํ ์กฐ์ ์ ์์ํ ์ ์์ต๋๋ค.
๋ค์ ๋จ๊ณ์์๋ 2๊ฐ์ ์ธ์๋ฅผ ์ฌ์ฉํ๊ณ ์บ๋ฆฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ณ ์บ๋ฆฌํ๋ ๋ค๋ฅธ ํจ์, ํนํ Add
/ Sub
/ etc. .
@gri ๊ธฐ๋ณธ 10 Len
๊ธฐ๋ฅ์ ๋ํ ์๊ฐ? ๊ทธ๋ฅ ((N - clz(x) + 1) * 1233) >> 12
๊ธฐ๋ณธ 2๋ณด๋ค ๋ "์ฝ๊ฐ ํดํค"ํ์ง๋ง ์ฌ์ ํ ์ ์ฉํฉ๋๋ค.
2017๋
2์ 10์ผ ๊ธ์์ผ ์คํ 5:03 Robert Griesemer [email protected]
์ผ๋ค:
์ฝ๊ฐ์ ์กฐ์ ์ ์ ๋ก๋ํ์ต๋๋ค. +1 ๋ฐ ๋๊ธ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ๋จ๊ฒจ ๋ณด๊ฒ ์ต๋๋ค.
์ ์๋ก ๊ณ์ฐํฉ๋๋ค.https://go-review.googlesource.com/36315
RotateLeft/Right์ ๋ํ ์ ๋ ฅ ์๋ฅผ uint๋ก ๋จ๊ฒจ๋์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด
๊ฐ์ด ์์์ด๊ฑฐ๋ ํ์ฉํ์ง ์์ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ง์ ํด์ผ ํฉ๋๋ค.๋ง์ง๋ง์ผ๋ก LenN(x) == N -
LeadingZerosN(x). ์๊ฒฌ?์ด ์์ ์์ ๋ ์ด์ ์ค์ํ ํผ๋๋ฐฑ์ด ์์ผ๋ฉด
์ด API๋ก ์งํํ๊ณ
๊ฒํ . ๊ทธ๋ฐ ๋ค์ ๊ตฌํ ์กฐ์ ์ ์์ํ ์ ์์ต๋๋ค.๋๋ ๋ค์ ๋จ๊ณ๋ก ์ฐ๋ฆฌ๊ฐ ์ด๋ค ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํ ์ ์๋์ง ๋ ผ์ํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค.
ํนํ 2๊ฐ์ ์ธ์๋ฅผ ์ฌ์ฉํ๋ Add/Sub/ ๋ฑ์ ํฌํจํ๊ณ ์ถ์ต๋๋ค.
์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์์ฐํ๊ณ ์ํํ์ญ์์ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/18616#issuecomment-279107013 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AFnwZ_QMhMtBZ_mzQAb7XZDucXrpliSYks5rbQjCgaJpZM4Lg5zU
.
๋ํ. ์ด ๋ฌธ์ ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋๋ผ๋ ์ค๋ก์ง๋ง ์ ๋ ํ์ธ๋ ์ฐ์ ์ ์ ํธํฉ๋๋ค. ์: AddN(x, y T) (sum T, overflow bool)
2017๋
2์ 10์ผ ๊ธ์์ผ ์คํ 8:16 Eric Lagergren [email protected]
์ผ๋ค:
๋ํ. ์ด ๋ฌธ์ ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋๋ผ๋ ์ค๋กํฉ๋๋ค.
ํ์ธ๋ ์ฐ์ ์ ์ ํธํฉ๋๋ค. ์: AddN(x, y T) (ํฉ T, ์ค๋ฒํ๋ก ๋ถ์ธ)์๋ช ๋ ์ค๋ฒํ๋ก์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น? ๋๋ ์๋ช ๋์ง ์์ ์ค๋ฒํ๋ก(carry/borrow)?
๋ํ ์ค๋ฒํ๋ก/์บ๋ฆฌ/๋น๋ฌ๋ฅผ T ์ ํ์ผ๋ก ๋ฐํํ์ฌ ๋จ์ํํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
๋ค์ค ์ ๋ฐ๋ ์ฐ์ .
@ericlagergren (๊ธฐ๋ณธ 2) Len
ํจ์๋ ๊ฑฐ์ log2์ด์ง๋ง ๋ณธ์ง์ ์ผ๋ก ์ฌ์ ํ ๋นํธ ๊ณ์ฐ ํจ์์
๋๋ค. ๋ฐ์ด 10์ธ Len
ํจ์๋ ์ค์ ๋ก ๋ก๊ทธ ํจ์์
๋๋ค. ์ ์ฉํ๋ค๋ ๊ฒ์ ๋ถ์ ํ ์ ์์ง๋ง ์ด ํจํค์ง์๋ ์ ํฉํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์, checked
์ฐ์ ์ ์
๋ ฅํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ๋จ์ง ํ์ฌ API๋ฅผ ๋จผ์ ์ข
๋ฃํ์ฌ ์๋ค๋ก ์ด๋ํ๋ ๋์ ์งํ์ ํ ์ ์๊ธฐ๋ฅผ ์ํ์ต๋๋ค. ์ง๊ธ๊น์ง ๋๊ธ์ ๋ฌ์๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๊ทธ๊ฒ์ ๋ง์กฑํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
Add, Sub ๊ธฐ๋ฅ์ ๊ดํ์ฌ: ๋๋ ์บ๋ฆฌ๊ฐ ์ธ์์ ๊ฐ์ ์ ํ์ด์ด์ผ ํ๋ค๋ @minux์ ๋์ํฉ๋๋ค. ๋ํ ์ด๋ฌํ ํจ์์ ๋ํด uint ์ธ์ ์ธ์ ๋ค๋ฅธ ๊ฒ์ด ํ์ํ๋ค๊ณ ํ์ ํ์ง ์์ต๋๋ค. ์์ ์ (๋๋ถ๋ถ์ ๊ฒฝ์ฐ) uint์ ํ๋ซํผ์ ๊ณ ์ ๋ ์ง์คํฐ ํฌ๊ธฐ๊ฐ ์๊ณ ์ด๊ฒ์ด ์ด๋ฌํ ์ฐ์ฐ์ด ๊ฐ์ฅ ์๋ฏธ ์๋ ์์ค์ด๋ผ๋ ๊ฒ์ ๋๋ค.
์ํ/์ฒดํฌ ํจํค์ง๋ ๊ทธ๋ฐ ์ฌ๋๋ค์๊ฒ ๋ ๋์ ์ง์ด ๋ ์ ์์ต๋๋ค. checked.Add
๋ bits.Add
๋ณด๋ค ๋ช
ํํฉ๋๋ค.
@minux ๋๋ ๋ถํธ ์๋ ์ฒดํฌ ์ฐ์ ์ฐ์ฐ์ ์๊ฐํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ค๋ฒํ๋ก๊ฐ ๋ฐ์ํ์ต๋๋ค.
@griesemer re: base 10 Len
: ๋ง์ด ๋๋ค์!
์ํ๋ ๊ฒฝ์ฐ ํ์ธ๋ ์ฐ์ ์ ๋ํ CL์ ์ ์ถํ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ณ๋์ ํจํค์ง ์ด๋ฆ ์๋์ ๋๋ @jimmyfrasche ์ ์์ด๋์ด๋ฅผ ์ข์ํฉ๋๋ค.
Add/sub/mul ์ bits
์ํ ์๋ ์๊ณ ์ํ์ง ์์ ์๋ ์์ง๋ง ์ด๋ฌํ ์ฐ์ฐ์ ์ฒดํฌ๋ ์ํ๋ง ์ฌ์ฉ๋๋ ๊ฒ์ ์๋๋๋ค. ๋ ์ผ๋ฐ์ ์ผ๋ก, ๋๋ ์ด๊ฒ์ด "๋์" ์ฐ์ ์ฐ์ฐ์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. add/sub์ ๊ฒฝ์ฐ ์บ๋ฆฌ/์ค๋ฒํ๋ก ๊ฒฐ๊ณผ์ 1๋นํธ์ ์ค๋ฒํ๋ก์ ๋ถ์ธ ํ์๊ธฐ ์ฌ์ด์๋ ๊ฑฐ์ ์ฐจ์ด๊ฐ ์์ง๋ง, ์ฐ๋ฆฌ๋ ์๋ง๋ ์ด๊ฒ์ ์ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด add-with-carry ๋ฐ ๋นผ๊ธฐ-with-borrow๋ฅผ ์ ๊ณตํ๊ธฐ๋ฅผ ์ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ wide mul์ ๊ฒฝ์ฐ ์ถ๊ฐ ๊ฒฐ๊ณผ์ overflow๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์ ๋ณด๊ฐ ์์ต๋๋ค.
์ฒดํฌ/์์ด๋ ์ฐ์ ์ฐ์ฐ์ ๊ธฐ์ตํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด์ง๋ง, 2์ฐจ๋ก ๋จ๊ฒจ๋๋๋ก ํฉ์๋ค.
"์ด ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ค๋ ๋ชจ๋ ์ฌ๋์ PopCount๊ฐ ๋ฌด์์ ํ๋์ง ์ ํํ ์ ๊ฒ์ ๋๋ค."
์ด์ ์ ๊ทธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์ด ์๊ณ ์ด๋ป๊ฒ๋ PopCount ์ด๋ฆ์ ์ต์ํ์ง ์์์ต๋๋ค("ํ"์ ์ฌ์ฉํ๋ Hacker's Delight์์ ๊ตฌํ์ ๊ผฌ์ง์๋ค๊ณ ํ์ ํ๊ธฐ ๋๋ฌธ์ ์์์ผ ํ์ง๋ง).
๋๋ ๋ด๊ฐ ํํฐ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง "OnesCount"๊ฐ ๋์๊ฒ ํจ์ฌ ๋ ๋ถ๋ช ํด ๋ณด์ด๋ฉฐ "PopCount"๋ผ๋ ๋จ์ด๊ฐ ๋ฌธ์ ๋๊ธ์ ์ธ๊ธ๋๋ฉด ๊ทธ๊ฒ์ ์ฐพ๋ ์ฌ๋๋ค์ด ์ด์จ๋ ๊ทธ๊ฒ์ ์ฐพ์ ๊ฒ์ ๋๋ค.
์ฒดํฌ/์์ด๋ ์ฐ์ ๊ด๋ จ: #6815. ํ์ง๋ง ๋ค, 1๋ผ์ด๋๋ฅผ ์์ํฉ์๋ค!
@griesemer ๋ ๋ค์
(base 2) Len ํจ์๋ ๊ฑฐ์ log2์ด์ง๋ง ๋ณธ์ง์ ์ผ๋ก ์ฌ์ ํ ๋นํธ ๊ณ์ฐ ํจ์์ ๋๋ค. ๋ฐ์ด 10์ธ Len ํจ์๋ ์ค์ ๋ก ๋ก๊ทธ ํจ์์ ๋๋ค. ์ ์ฉํ๋ค๋ ๊ฒ์ ๋ถ์ ํ ์ ์์ง๋ง ์ด ํจํค์ง์๋ ์ ํฉํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋์ ๊ฒ์ ์ง๋ 10 ์ "์ง์ ๊ธธ์ด"๋ฌธ์ ์ ๋ํ ๋ช ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ๋น๊ตํ๋ ๋ฒค์น ๋งํฌ ์ด ์์ง๋ฅผ .
์ ์์ผ๋ก ์๋ฝ๋จ; ์์ผ๋ก ์ฝ๊ฐ์ ์กฐ์ ์ด ์์ ์ ์์ผ๋ฉฐ ๊ด์ฐฎ์ต๋๋ค.
@rogpeppe : PopCount
์ OnesCount
๋ก ๋ณ๊ฒฝํ์ต๋๋ค( PopCount
์ ์ฌ์ฉํ๋ผ๋ ์ ์ ์์ฒ๋ผ). ๋ฌธ์ ๋ฌธ์์ด์์ "์ธ๊ตฌ ์"๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
@rsc ๋น, ์ง๊ธ์ ์ฒดํฌ/์์ด๋ ์ฐ์ ์ฐ์ฐ์ ์๋ตํฉ๋๋ค.
๋ํ @rsc์ ๋ฐ๋ผ ๋ชจ๋ ์นด์ดํ
ํจ์๋ int
๊ฐ์ ๋ฐํํ๊ณ ์ฌ์ฉ ํธ์์ฑ์ ์ํด(#19113์ ์ฃผ๋ชฉ) ํ์ ์์ int
๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
LenN
ํจ์๋ ๋จ์ํ N - LeadingZerosN
์์๋ ๋ถ๊ตฌํ๊ณ ์ ๋จ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋น์ทํ ๋์นญ์ด RotateLeft
/ Right
ํ๋ฉฐ ์ฐ๋ฆฌ๋ ๋ ๋ค ๊ฐ์ง๊ณ ์์ต๋๋ค.
TrailingZeroes
๋ํด ์ฝ๊ฐ ๋ ๋น ๋ฅธ ๊ตฌํ์ ์ถ๊ฐํ๊ณ ํ
์คํธ๋ฅผ ์๋ฃํ์ต๋๋ค.
์ด ์์ ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฒซ ๋ฒ์งธ ๊ตฌํ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. https://go-review.googlesource.com/36315 , ํนํ API์์ ์ฝ๋๋ฅผ ๊ฒํ ํ์ธ์. ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ํ๋ณตํ๋ค๋ฉด ์ด๊ฒ์ ์ ์ถํ๊ณ ์ถ์ต๋๋ค.
๋ค์ ๋จ๊ณ:
์ฐ๋ฆฌ๋ ์๋ก์ด ํจํค์ง๋ฅผ ๋์์ธํ๊ณ ์์ต๋๋ค
@minux ๋น์ ์ ์๋ก์ด ์ํ/ํฐ์ ์๋ฏธํฉ๋๊น? ์ด๋๊ฐ์์ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ฅผ ์ ์์ต๋๊น?
@TuomLarsen : @minux ๋ "์ ํจํค์ง"๋ก ์ํ/๋นํธ๋ฅผ ์ฐธ์กฐํ์ต๋๋ค. ๊ทธ๋ ์ํ/๋นํธ๊ฐ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ก ์ํ/๋น ์ ์ธ๊ธํ์ต๋๋ค. (์์ผ๋ก ๊ทํ์ ์๊ฒฌ์ ๋ณด๋ค ๊ตฌ์ฒด์ ์ผ๋ก ์์ฑํ์ฌ ๊ทํ๊ฐ ๋งํ๋ ๋ด์ฉ์ ๊ฒ์ํ๊ณ ์ถ์ธกํ ํ์๊ฐ ์๋๋ก ํ์ญ์์ค. ๊ฐ์ฌํฉ๋๋ค.)
CL https://golang.org/cl/37140์ ์ด ๋ฌธ์ ๊ฐ ์ธ๊ธ๋์ด ์์ต๋๋ค.
Go 1.9์ ์ํ/๋นํธ์์ ์ปดํ์ผ๋ฌ ์ง์ ๋ด์ฅํ๊ฐ ์์ต๋๊น?
@cespare ๋๋ฌ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค(@khr?). ๊ทธ๊ฒ๊ณผ๋ ๋ณ๊ฐ๋ก, ์ฐ๋ฆฌ๋ ์ ์ ํ ํ๋ซํผ ๋ ๋ฆฝ์ ๊ตฌํ์ โโ์ํฉ๋๋ค. (์ํ/๋ํ์ ์ํ/๋นํธ ์ฌ์ฉ์ผ๋ก ์์ ํ ์ฎ๊ธฐ๊ณ ์ถ์ง ์์ ์ด์ ์ค ํ๋๋ ํ์ฌ ๋ ๋น ๋ฅธ ์ํ/๋ํ์ ํ๋ซํผ๋ณ ์ด์ ๋ธ๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.)
๋ด ์ ์์๋ ์ ์ด๋ ์์น์ ๋ํด์๋ ์ด๋ฏธ ๋ด์ฅ๋์ด ์์ต๋๋ค.
(386,amd64,arm,arm64,s390x,mips, ์๋ง๋ ppc64).
2017๋ 2์ 17์ผ ๊ธ์์ผ ์คํ 12์ 54๋ถ, Robert Griesemer < [email protected]
์ผ๋ค:
@cespare https://github.com/cespare ๋๋ฌ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค (
@khr https://github.com/khr ?). ๊ทธ๊ฒ๊ณผ ๋ณ๊ฐ๋ก ์ฐ๋ฆฌ๋
์ ์ ํ ํ๋ซํผ ๋ ๋ฆฝ์ ๊ตฌํ. (์ฐ๋ฆฌ๊ฐ ํ์ง ์๋ ์ด์ ์ค ํ๋๋
์ํ/๋นํธ๋ฅผ ์ํ/๋นํธ ์ฌ์ฉ์ผ๋ก ์์ ํ ์ฎ๊ธฐ๊ณ ์ ํ๋ ๊ฒ์ ํ์ฌ ์ฐ๋ฆฌ๊ฐ
๋ ๋น ๋ฅธ math/big์ ํ๋ซํผ๋ณ ์ด์ ๋ธ๋ฆฌ๊ฐ ์์ต๋๋ค.)โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/18616#issuecomment-280763679 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AGkgIIb8v1X5Cr-ljDgf8tQtT4Dg2MGiks5rdgkegaJpZM4Lg5zU
.
x86-64์์ ์ธ๊ตฌ ์๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ๋ํ ์ด ๊ธฐ์ฌ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์์ผ๋ก ์ฝ๋ฉํ ์ด์ ๋ธ๋ฆฌ๋ ์๋์ ๋จ์์ฑ ๋ฉด์์ ๋ด์ฅ ๊ธฐ๋ฅ์ ๋ฅ๊ฐํฉ๋๋ค. โ Dan Luu, 2014๋ 10์
CL https://golang.org/cl/38155์ ์ด ๋ฌธ์ ๊ฐ ์ธ๊ธ๋์ด ์์ต๋๋ค.
CL https://golang.org/cl/38166์ ์ด ๋ฌธ์ ๊ฐ ์ธ๊ธ๋์ด ์์ต๋๋ค.
CL https://golang.org/cl/38311์ ์ด ๋ฌธ์ ๊ฐ ์ธ๊ธ๋์ด ์์ต๋๋ค.
CL https://golang.org/cl/38320์ ์ด ๋ฌธ์ ๊ฐ ์ธ๊ธ๋์ด ์์ต๋๋ค.
CL https://golang.org/cl/38323์ ์ด ๋ฌธ์ ๊ฐ ์ธ๊ธ๋์ด ์์ต๋๋ค.
๋ ๋ง์ ํ ๋ก :
๋:
math/bits.RotateLeft๋ ํ์ฌ ์ธ์๊ฐ 0๋ณด๋ค ์์ ๊ฒฝ์ฐ ํจ๋ํ๋๋ก ์ ์๋์ด ์์ต๋๋ค.
arg๊ฐ 0๋ณด๋ค ์์ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ ํ์ ์ ์ํํ๋๋ก RotateLeft๋ฅผ ์ ์ํ๋๋ก ๋ณ๊ฒฝํ๊ณ ์ถ์ต๋๋ค.
์ด ํจ๋๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋ฃจํด์ ๊ฐ๋ ๊ฒ์ ๋ถํ์ํ๊ฒ ๊ฐํนํ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์์๋งํผ ํ์ ํ๋ ๊ฒ์ 0์ผ๋ก ๋๋๊ธฐ(ํจ๋ ๋ฐ์) ๋์ ๋จ์ด ํฌ๊ธฐ(ํจ๋ํ์ง ์์)๋ณด๋ค ํฐ ์ํํธ์ ๋ ์ ์ฌํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. 0์ผ๋ก ๋๋๊ธฐ๋ ์ค์ ๋ก ๋นํฉํด์ผ ํฉ๋๋ค. ๋์ ๋ฐํํ ํฉ๋ฆฌ์ ์ธ ๊ฒฐ๊ณผ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์๋งํผ ํ์ ํ๋ฉด ๋ฐํํ ์ ์๋ ์๋ฒฝํ๊ฒ ์ ์๋ ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค.
์ด์ ๋ ์ค ํ๋๋ฅผ ๋ค๋ฅธ ํ๋์ ํจ๊ป ๊ตฌํํ ์ ์์ง๋ง RotateLeft์ RotateRight๋ฅผ ๋ณ๋์ ๊ธฐ๋ฅ์ผ๋ก ์ ์งํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ค ์ฌ์ฉ๋ฒ์ ์ฌ์ ํ โโ์์๊ฐ ์๋ ์ธ์์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ญ๊ฐ๋ฅผ ํ๋ ค๋ฉด ๋๊ฒฐ๋ก ํด์ผ ํฉ๋๋ค. ์ผ๋จ go 1.9๊ฐ ๋์ค๋ฉด ๋ง์์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
๋กญ:
์ ๋ง ์ด๋ฐ ๊ฒ์ ์ํ์ ๋ค๋ฉด, ์ผ์ชฝ์๋ ์์๋ฅผ, ์ค๋ฅธ์ชฝ์๋ ์์๋ฅผ ์ฌ์ฉํ๋ ํ์ ๊ธฐ๋ฅ๋ง ์์ผ๋ฉด ๋ฉ๋๋ค.
๋:
๋ฌธ์ ๋
bits.Rotate(x, -5)
์ด ์ฝ๋๋ฅผ ์ฝ์ ๋ ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ํ๋์ง ์ฌ๋ถ๋ ๋ช
ํํ์ง ์์ต๋๋ค.
bits.RotateRight(5)
์ํ/๋นํธ์ ๋ ๋ฐฐ์ ํ์ * ํจ์๊ฐ ์์์ ์๋ฏธํ๋๋ผ๋ ํจ์ฌ ๋ ๋ช
ํํฉ๋๋ค.
๋ง์ดํด ์กด์ค:
๋ถํธ ์๋ ํ์ ์ ์ฝ๋์์ ์ ํ๋ฅผ ์๋ฏธํฉ๋๋ค. ์? ๋ถ์ํด ๋ณด์ธ๋ค.
๋:
์๋์, ์ ์๋ ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์ ๋ก ๊ตฌํ์ด ๋ ๊ฐ๋จํฉ๋๋ค. ํ์ 6๋นํธ(64๋นํธ ํ์ ์ ๊ฒฝ์ฐ)๋ฅผ ๋ง์คํนํ๋ฉด ์ ๋๋ก ์๋ํฉ๋๋ค.
๋๋ ์๋ช ๋ ์ธ์๊ฐ ์๋ ๋จ์ผ ํ์ ์ ์ ํธํฉ๋๋ค. ์ด๋ ํจ์ ์์ ์ ๋ฐ์ ์๋ฏธํ๊ณ ํจ๋์ด๋ ์กฐ๊ฑด ๋ถ๊ธฐ ์์ด ๋ชจ๋ ๊ฒฝ์ฐ์ ๋งค์ฐ ํจ์จ์ ์ผ๋ก ์ํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด์จ๋ ํ์ ์ ์ ๋ฌธ ๊ธฐ๋ฅ์ด๋ฏ๋ก ์ด๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ๊ธ์ ์ ์ธ ์ธ์๊ฐ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๊ณ ๋ถ์ ์ ์ธ ์ธ์๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ค๋ ์ ์ ๊ธฐ์ตํ๋ ๊ฒ์ด ํธ์ํ ๊ฒ์ ๋๋ค.
ํญ์ ์ฐจ์ด๋ฅผ ๋ถํ ํ๊ณ ์๋ช
๋ ์ธ์์ ํจ๊ป RotateLeft
๋ง ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ฐฉํฅ์ ๋ํ ํธ๋ฆฌํ ๋๋ชจ๋์ ์ ๊ณตํ์ง๋ง ์ค๋ณต ๊ธฐ๋ฅ์ ํผํฉ๋๋ค.
@bcmills @robpike ๋ํ https://github.com/golang/go/issues/18616#issuecomment -275598092์์ ์์ํ์ฌ ๋ช ๊ฐ์ง ์๊ฒฌ์ ๋ํด ๊ณ์ํด์ ์ด ์ ํํ ์ฃผ์ ์ ๋ํ ์ด์ ํ ๋ก ์ ์ฐธ์กฐํ์ญ์์ค.
@josharian ๋๋ ๋๊ธ์ ๋ณด์์ง๋ง ์ฌ์ ํ ๋ด ๋ฒ์ ์ ์ ํธํฉ๋๋ค. ์ด๊ฒ์ ์์ํ ์์ ๊ฑฐ๋ฅผ ํ ์ ์์ง๋ง ๊ตฌํํ๊ธฐ ์ฝ๊ณ , ์ ์ํ๊ธฐ ์ฝ๊ณ , ์ดํดํ๊ธฐ ์ฝ๊ณ , ๋ฌธ์ํํ๊ธฐ ์ฝ์ต๋๋ค. ๋๋ ์๋ช ๋ ์ธ์๊ฐ ์๋ ๋จ์ผ ํ์ ํจ์๊ฐ ๋ถํธ๋ฅผ ์ ์ํ ํ์์ฑ์ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ๊ฒ์ ์ถฉ์กฑํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ผ์ชฝ์ ์์์ด๋ฏ๋ก ํ์ ๋ช ๋ น์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์ฌ๋์๊ฒ ์ง๊ด์ ์ด์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ ์ผ์ชฝ์ ํ์ ๋ช ๋ น์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์ฌ๋์๊ฒ ์ง๊ด์ ์ด์ด์ผ ํฉ๋๋ค.
๋๋ ์ค์ค๋ก ํ์ ๋ช ๋ น์ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํ๊ณ ๋ด ์ง๊ฐ์ "์ด๋ฐ, ์ ์ด๊ฒ์ด ๋ฐฉํฅ์ด ๋ฌด์์ธ์ง ๋งํ์ง ์์ต๋๊น? ์๋ง๋ ์ผ์ชฝ์ด์ง๋ง ํ์คํ๊ฒ ๋ฌธ์ ํ ๊ฒ ์ ๋๋ค." ๊ธ์ ์ ์ธ ๋ฐฉํฅ์ ์ ํํ๋ ค๋ ๊ฒฝ์ฐ ์ผ์ชฝ ํ์ ์ด ๋ ๊ฒ์ด๋ผ๋ ์ง๊ด์ ์ธ ๋ฐ ๋์ํฉ๋๋ค. ํ์ง๋ง ์ด๋ค ๊ฒ์ด ๋งค์ฐ ๋ช ๋ฐฑํ๊ฒ ์ ๋ต์ด ๋๊ธฐ์๋ ํจ์ฌ ๋ ๋์ ์๊ณ๊ฐ์ด ์์ด์ ๋ชจ๋ ํธ์ถ ์ฌ์ดํธ์์ ๋งํ ํ์ ์์ด ํ์ ํ๋ ๋ฐฉํฅ์ด ๋ฌด์์ธ์ง ๋ช ํํฉ๋๋ค. ๊ทธ๊ฒ.
๊ฐ๋
์ฑ์ ๊ดํด์๋ time.Duration
API ๋ผ์ธ์ ๋ฐ๋ผ๊ฐ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
const RotateRight = -1
bits.Rotate(x, 5 * RotateRight)
๋นํธ๋ก ์ ์๋ ์์ ๋๋ ๋ ์(ํธ์ถ ์ฌ์ดํธ)๋ฅผ ์ํ ์ฐ์ต์ผ ์ ์์ต๋๊น?
@aclements ๋ฐ๋ผ์ ์ธ์์ ๋ถํธ๋ง ๋ค๋ฅธ ๋์ผํ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ ๊ฐ์(N ์ ํ์ ๋ฐฐ) ํจ์๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ Add ๋ฐ Sub์ ๋ํด ๊ทธ๊ฒ์ ํ์ฉํ์ง๋ง ๋ด๊ฐ ์๊ฐํ ์ ์๋ ์ ์ผํ ์์ ๋๋ค.
์ซ์ ์ถ์์ ์์๋ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฆ๊ฐํ๋ฏ๋ก ๋ถํธ์ ์ํด ์ ์๋ ๋ฐฉํฅ ํ์ /์ด๋์ด ์์์ ๋ํด ๋นํธ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
[๋ฌธ์ํ] ๋ฐ๋์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ง๊ด์ ์ด๋ผ๊ณ ๋ถ๋ฅด์ง๋ ์์ต๋๋ค.
@cznic ๋นํธ๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฐ์ฌ์ง์ง๋ง
๋ํ ์๋ฐฉํฅ์ผ๋ก ์๋ํ๊ฒ ํ๋ ๊ฒฝ์ฐ Rotate
(https://github.com/golang/go/issues/18616#issuecomment-275016583)์ ์ฐฌ์ฑํฉ๋๋ค.
๋ฐฉํฅ์ ๋ํ @aclements ์ฐ๋ ค์ ๋ํ ๋ฐ๋ก ์ผ๋ก์: ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ํ ๋๋ ์๋ํ๋ RotateLeft
๋ฅผ ์ ๊ณตํ๋ฉด ์๋ชป๋ ๋ณด์ ๊ฐ๊ฐ์ ์ ๊ณตํ ์๋ ์์ต๋๋ค. " RotateLeft
๋์ด ์์ผ๋ฏ๋ก ํ์คํ ํ์ ํ์ง ์์ต๋๋ค. ์ค๋ฅธ์ชฝ!". ์ฆ, RotateLeft
๋ผ๊ณ ํ์๋๋ฉด ๋ค๋ฅธ ์์
์ ์ํํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ํ bits.Rotate
์ ์ค์ ๋ก ์ ๋ฌธ๊ฐ ์ฝ๋์์๋ง ์ฌ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ง์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด ์๋๋๋ค. ๊ทธ๊ฒ์ ์ ๋ง๋ก ํ์๋ก ํ๋ ์ฌ์ฉ์๋ ํ์ ์ ๋์นญ์ ์ดํดํ ๊ฒ์
๋๋ค.
@๋๋ค๋
๋นํธ๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฐ์ฌ์ง์ง๋ง
๋นํธ๋ ์ด์ง์์ผ ๋ฟ์ ๋๋ค. ๋ชจ๋ ๊ธฐ์์์ ์ซ์์ ์ซ์๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ธฐ๋ก๋ฉ๋๋ค. ๋ชจ๋ ๊ฒ์ ์๋์ง๋ง ๋๋ถ๋ถ์ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ์ฐ๊ธฐ ์์คํ ์์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. 123์ ์ผ๋ฐฑ์ด์ญ์ผ์ด ์๋๋ผ ๋ฐฑ์ด์ญ์ผ์ ๋๋ค.
์ซ์์ ๋ํ ํผ์น์์ ๊ฑฐ๋ญ์ ๊ณฑ์ด ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ์ํ๋ค๋ ๊ฒ์ ๋ค๋ฅธ ๊ฒ์ ๋๋ค.
๋ค์ ํ ๋ฒ: ๋๋ ๋ฐฉํฅ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ์ง๊ด์ ์ธ ๋ฐฉํฅ์ ๊ฐ์ธ์ ์ธ ์์์ ๋ฌธ์ ์ผ ๋ฟ์ ๋๋ค.
๋๋ ํ์ ์ ์ข์ํฉ๋๋ค. ์ตํ์ ๋นํธ๋ ์ง๊ด์ ์ผ๋ก ์ถฉ๋ถํ 0์ ๋๋ค.
๊ฐ๋ฐ์์ ์ ๋ฐ์ด ์๋ชป ๊ธฐ์ตํ ์์ ์ ํ๋ ๋์ RotateLeft์ RotateRight๋ฅผ ๋ชจ๋ ์ ์งํ์ญ์์ค. ํ์ง๋ง ์์๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ๋ฐ์์ 99%๋ ํ์ ๋ช ๋ น์ ํ๋ก๊ทธ๋๋ฐํ์ง ์์ผ๋ฏ๋ก ๋ช ํํ ๋ฐฉํฅ์ ๋ํ ํ์์ฑ์ ๊ธฐ๊ปํด์ผ ์ฝํฉ๋๋ค. ์ ํ ํ ํต์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค.
์ด ๋ ผ์๋ฅผ ๋ค์ ์ผ๊นจ์์ค ๋ฌธ์ ๋ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ๊ฐ์ถ๋ ค๋ฉด ์์ ๊ฐ์ด ๊ด์ฐฎ์์ง ์ฌ๋ถ์ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์ ๋ํด ๋ ผ์ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ํ๋๋ง ์์ผ๋ฉด ์ ์ฒด ๋ ผ์์ด ์ฌ๋ผ์ง๋๋ค. ๋ ๊น๋ํ ๋์์ธ์ ๋๋ค.
๊น๋ํ ๋์์ธ์ ๋ํ ์ฃผ์ฅ์๋ ๋ค์ ๊ณต๊ฐํ์ง๋ง "RotateRight"์์ "Right"๋ฅผ ์ ๊ฑฐํ๋ฉด์ ๋์ผํ ๊ตฌํ์ ์ ์งํด์ผ ํ๋ ๊ฒ์ด ์ด์ํด ๋ณด์
๋๋ค. ์ค์ฉ์ ์ธ ์ธก๋ฉด์์ ์ง๋ฌธ์ ๋๋ตํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ด๋ฆ์ด ์ ๊ธฐํ๋ ์ง๋ฌธ์ ํตํด ๋ฌธ์๋ฅผ ๋ณด๋ ์ฌ๋๋ค์๊ฒ ๋ฌธ์๋ฅผ ์ฝ๋๋ก ๊ฐ์ํ๋ ๊ฒ์
๋๋ค.
๊ฒฐ๊ตญ ์์ ๊ฐ์ ๋ํ ๋ช
ํํ ๋ฐฉํฅ ๋ ๋ชจํธํ์ง ์์ ๋์์ ๋ฌธ์ ์
๋๋ค. ์์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๋ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์
๋๋ค.
๋ด๊ฐ ๋งํ๋ ๊ฒ์ ํ์ ์ด ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ํ๋์ ์ง๋ฌธ์ ์ ๊ธฐํ๊ณ ๋ฌธ์๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋๋ตํ๋ค๋ ๊ฒ์
๋๋ค.
RotateRight๋ ๋ฌธ์์ ๊ด์ฌ์ด ์๋ค๋ฉด ๋ฌธ์๋ฅผ ์ฝ์ ์ ์๊ณ ์ฝ์ด์ผ ํ๋ ์์์ ์ฌ๋๋ค์๊ฒ ํ ๊ฐ์ง ์ง๋ฌธ์ ์ ๊ธฐํฉ๋๋ค.
๋ฐ๋ฉด์ ํ์ ์ ์๋ง๋ ์ฌ๋๋ค์ด if n < 0 { RotateLeft(...) } else { RotateRight(...) }
๋ฅผ ์ฐ๋ ๊ฒ์ ๋ฐฉ์งํ ๊ฒ์
๋๋ค.
@ golang / ์ ์์ ๊ฒํ ๋์ด ๋ฌธ์ ๋ฅผ ๋
ผ์ํ๊ณ ํ ๊ธฐ๋ฅ์ ๊ฐ์ง, ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ช
๋ช
์ ๊ฒฐ๊ตญ RotateLeft
๋ค๋ง,ํ์ง Rotate
ํธ์ถ ์ฌ์ดํธ์์ ์ถ๊ฐ ๋ช
ํํ๊ฒํ๊ธฐ ์ํด. ์์๋ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ํ๋ฉฐ ๋ฌธ์์์ ์ด๋ฅผ ๋ช
ํํ ํ ๊ฒ์
๋๋ค.
CL https://golang.org/cl/40394์ ์ด ๋ฌธ์ ๊ฐ ์ธ๊ธ๋์ด ์์ต๋๋ค.
CL https://golang.org/cl/41630์ ์ด ๋ฌธ์ ๊ฐ ์ธ๊ธ๋์ด ์์ต๋๋ค.
์ด ์์ ์์ ์๋ ์ ์๊ณผ ๋ช ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์ค๊ณ ๋ฐ ๊ตฌํ๋์์ต๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๊ฐํ ์ ์์ง๋ง ํ์ฌ๋ก์๋ ํฉ๋ฆฌ์ ์ผ๋ก "์๋ฒฝํ" ๊ฒ ๊ฐ์ต๋๋ค.
ํนํ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฒฐ์ ํ๊ฑฐ๋ ๊ตฌํ ํ์ง ์์์ต๋๋ค .
๊ฐ์ธ์ ์ผ๋ก ๋๋ ๊ทธ๊ฒ๋ค์ด "๋นํธ" ํจํค์ง์ ์ํ๋ค๊ณ ํ์ ํ์ง ์์ต๋๋ค(ํ ์คํธ๊ฐ ๊ทธ๋ด ์๋ ์์). ๋ค์ค ์ ๋ฐ๋ add/sub/mul์ ๊ตฌํํ๋ ํจ์๋ ์ผ๋ถ ์ํ/ํฐ ์ปค๋์ ์์ํ Go ๊ตฌํ์ ํ์ฉํ์ง๋ง ์ธ๋ถ์ฑ์ด ์ณ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ ๋ฒกํฐ์์ ์๋ํ๋ ์ต์ ํ๋ ์ปค๋๊ณผ ์ต๋ ํด๋น ์ปค๋์ ๋ํ ์ฑ๋ฅ์ ๋๋ค. add/sub/mul "๋ณธ์ง"์๋ง ์์กดํ๋ Go ์ฝ๋๋ก ์ด๋ฅผ ๋ฌ์ฑํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ํ์ฌ๋ก์๋ ํฐ ๋ฐ๋๊ฐ ์๋ ํ ์ด ๋ฌธ์ ๋ฅผ "์๋ฃ"๋ก ๋ซ๊ณ ์ถ์ต๋๋ค. ํ์์ ๋ฐ๋ํ๋ ๊ฒฝ์ฐ ๋ค์ ์ฃผ์ ๊ฑธ์ณ ๋ฐ์ธํ์ญ์์ค.
๋๋ ๊ทธ ๋ผ์ธ์ ๋ฐ๋ผ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ฐฌ์ฑํฉ๋๋ค.
๋๋ ๊ทธ๋ค์ด ๊ทธ๋ค์ ์งํฉ์ ๊ธฐ๋ฅ์ ๋ ์ ๋ฐ์ํ๋ ์ด๋ฆ์ ๋ถ์ฌํ๋ ๊ฒ ์ธ์ ๋ค๋ฅธ ์ด์ ๊ฐ ์๋ค๋ฉด ๊ทธ๊ฒ๋ค์ด ๊ทธ๋ค ์์ ์ ํจํค์ง์ ์ํ๋ค๊ณ ๊ฐ๋ ฅํ๊ฒ ๋ฏฟ์ต๋๋ค.
:+1: ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ ๋ ๋ฐ :heart: ์ง๊ธ๊น์ง ์๋ฃ๋ ์์ ์ ๋ํด.
์ด์๊ฐ ์์ด ํ์ํฉ๋๋ค.
์ด๊ฒ์ API์ ๊ดํ ํฅํ ๊ฒฐ์ ์ ๋ํ ์๊ฒฌ์ ๋๋ค. ์ด ํน์ ํญ๋ชฉ์ด ์ค์ ๋์ด ์์์ ์ดํดํฉ๋๋ค.
Rotate
๋ ์ ๋ฌธ ๊ธฐ๋ฅ์
๋๋ค. LTR ๋๋ RTL์ ์ฃผ์ด์ง ์ปจํ
์คํธ์์๋ง ๊ด๋ จ์ด ์์ต๋๋ค. @aclements ๊ฐ ์ ํจํ ์ง๋ฌธ์ ์ ๊ธฐ
๊ทธ๋ฌ๋ ๋์ ์๋ฆฌํจ์ด ๋ค๋ฐ๋ฆ ๋๋ค.
"์ ๋ฌธ ๊ธฐ๋ฅ"์ด ์๋ฏธํ๋ ๊ฒ์ ๊ทธ๋ ๊ฒ ๊ฐ๋จํ ๊ฒ์ด๋ฏ๋ก ๋นจ๋ฆฌ ๋ฌด์๋์์ ๊ฒ์ ๋๋ค. ์ฝ๋ ์ํ์ด ์ฃผ์ด์ง๋ฉด ์ฝ๋ ๋ผ์ธ์ ๋ง๋๊ธฐ ์ ์๋ ํ์ ์ด ๋ฐ์ํ๊ณ ๋ฐฉํฅ์ ์ด๋ฏธ ์ดํดํ๊ณ ์์ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์ฝ๋๋ ๋๊ฐ ์ด๋ฏธ ์๋ ๊ทธ๋๋ก์ ์์์ ์ธ ASCII ๋ฌธ์๊ฐ ์ ํ๋ฉ๋๋ค.
์ ์ ์ ์ผ๋ก ํผ๋์ค๋ฌ์ด ๊ฒ์ Go๊ฐ ๋จ์ํ API ๊ด์ ์์ ๋นํธ๋ฅผ ํด์ํ๋ ํ์ค ๋ฐฉ๋ฒ์ผ๋ก RTL์ ์ ํํ ์ ์๋ค๋ ๊ฒ์ด ์๋๋ผ, ๋จผ์ 1.9์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ ธ์์ ์๋๊ฐ ์๋ RotateLeft๋ฅผ ์ฐพ์๊ณ ๋ฌธ์์์ ๋ถ์ ์ ์ธ ๋ณดํญ. ์ด๊ฒ์ 1.9์ ์๋ฅํ๋ ๊ฒ์ด ๋งค์ฐ ๋ถํํ ๋ง์์ ๋ง๋น์ํค๋ ์์ํ์ ๊ฐ์ ๊ฒฐ์ ์ ๋๋ค.
๋๋ ๋ฏธ๋๋ฅผ ์ํด ์ฌ์ฉ ์ปจํ ์คํธ๋ฅผ ๊ณ ์ํ๊ธฐ๋ฅผ ๊ฐ์ฒญํฉ๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ "์ ์ฐ๋ฆฌ๋ RotateLeft์ ๋์ํ๋ ๊ฒ์ ์ ๊ณตํ์ง ์๊ณ , ๋ถ์ ์ ์ธ ๋ณดํญ์ ๋ํด ๋นํฉํ๊ฑฐ๋ ๋ณดํญ์ ๋ํด int ๋ uint์ ๋ํด ํ ๋ก ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?"์ ๊ฐ์ ์ง๋ฌธ์ผ๋ก ์๋ช ํด์ผ ํฉ๋๋ค. ๊ฒฐ๊ตญ '์ ๋ฌธ์ ๊ธฐ๋ฅ'์ด ์๋ฏธํ๋ ๋ฐ๋ ์๋ฆฌํ์ง ๋ชปํ๋ค๋ ์ด์ ๋ก ์ฝ๊ฒ ์ธ๋ฉด๋นํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
API๋ฅผ ์ ๋นํํ๋ ๋ฐ ์๋ฆฌํจ์ ํผํ๋๋ก ํฉ์๋ค. ์ด 1.9 ์ ๋ฐ์ดํธ์์ ๋ณด์ฌ์ค๋๋ค.
https://golang.org/cl/90835 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: cmd/compile: arm64 intrinsics for math/bits.OnesCount
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฝ๋๋ฅผ ์์ฑํ๋ ์ฌ๋๋ค์ ์ผ์ชฝ์ผ๋ก ํ์ ํ๊ฑฐ๋ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ทธ๋ค์ ์ข์ฐ๋ก ํ์ ํ๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ์ผ์ชฝ ํ์ ๋ง ์ ๊ณตํ๋ค๋ฉด ์ค๋ฅธ์ชฝ ํ์ ์ ์ํ๋ ์ฌ๋์ ์ค๋ฅธ์ชฝ ํ์ ์ ์ผ์ชฝ ํ์ ์ผ๋ก ๋ณํํ๋ ํํ์์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์ปดํจํฐ๊ฐ ํ์ฐฎ๊ฒ ํ ์ ์๋ ํํ์ด์ง๋ง ํ๋ก๊ทธ๋๋จธ๋ ์ค์๋ฅผ ํ ๊ฒ์ ๋๋ค. ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์์ฑํ๊ฒ ํฉ๋๊น?