Go: ์ˆ˜ํ•™/๋น„ํŠธ: ์ •์ˆ˜ ๋น„ํŠธ ํšŒ์ „ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์— ๋งŒ๋“  2017๋…„ 01์›” 11์ผ  ยท  168์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: golang/go

https://github.com/golang/go/issues/17373 ๋ฐ https://github.com/golang/go/issues/10757์˜ ์ด์ „ ํ† ๋ก 

์ถ”์ƒ์  ์ธ

์ด ์ œ์•ˆ์€ ์ •์ˆ˜ ๋น„ํŠธ ํŠธ์œ„๋“ค๋ง์„ ์œ„ํ•œ API ์„ธํŠธ๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ

์ด ์ œ์•ˆ์€ ์ •์ˆ˜ ๋น„ํŠธ twiddling์„ ์œ„ํ•œ API ์„ธํŠธ๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์„ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ๊ธฐ๋Šฅ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ctz - ํ›„ํ–‰ 0์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • clz - ์„ ํ–‰ 0์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ_2.
  • popcnt - ์ธ๊ตฌ ์ˆ˜; ํ•ด๋ฐ ๊ฑฐ๋ฆฌ; ์ •์ˆ˜ ํŒจ๋ฆฌํ‹ฐ.
  • bswap - ๋ฐ”์ดํŠธ ์ˆœ์„œ๋ฅผ ๋ฐ˜๋Œ€๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ์„ค๋ฌธ ์กฐ์‚ฌ๋ฅผ ํ†ตํ•ด ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํŠธ์œ„๋“ค๋ง ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์ด ๋„ค ๊ฐ€์ง€ ๊ธฐ๋Šฅ์œผ๋กœ ์ œํ•œํ–ˆ์Šต๋‹ˆ๋‹ค.
ํŠธ๋ฆญ์€ ์ œ์•ˆ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
๋˜๋Š” ์ด๋ฏธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ 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

์ด๋ก ์  ํ•ด์„

์ด ์ œ์•ˆ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋น„ํŠธ ํšŒ์ „ ํ•จ์ˆ˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ํšจ๊ณผ๊ฐ€ ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์€ ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์› ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด Golang ์‚ฌ์šฉ์ž๋Š” ๋Š๋ฆฐ ๊ตฌํ˜„์„ ๊ณ„์† ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ runtime/internal/sys๋ฅผ ๋Œ€์ฒดํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์ž ๊ฒจ ์žˆ์–ด์•ผ ํ•˜๊ณ  ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธํ™˜์„ฑ

์ด ์ œ์•ˆ์€ ๊ธฐ์กด stdlib API๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ค‘๋‹จํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ˜ธํ™˜์„ฑ ์ง€์นจ์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„

SwapBytes, TrailingZeros ๋ฐ LeadingZeros๋Š” ์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์€ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์ด ์ˆ˜๋ฝ๋˜๋ฉด Go1.9์— ๋งž์ถฐ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ(ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ)

์ด๋ฆ„์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ž์ „๊ฑฐ ๋ณด๊ด€์†Œ๋Š” ๋Œ“๊ธ€์— ์žˆ์Šต๋‹ˆ๋‹ค.

์˜๊ฒฌ์— ํฌํ•จ๋  ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ์•ˆํ•˜์‹ญ์‹œ์˜ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด stdlib(์˜ˆ: math/big), ๋„๊ตฌ ๋˜๋Š” ์ธ๊ธฐ ์žˆ๋Š” ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์œ„์น˜๋ฅผ ํฌํ•จํ•˜์‹ญ์‹œ์˜ค.

์ง€๊ธˆ๊นŒ์ง€ ์ œ์•ˆ๋œ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „ / ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํšŒ์ „

    • ์žฅ์ : &63์€ ๋” ์ด์ƒ x86, x86-64์˜ ๋‹จ์ผ ๋ช…๋ น์–ด์— ๋Œ€ํ•ด ๋น„ const ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ํšŒ์ „์„ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

    • ๋‹จ์ : ๊ตฌํ˜„ ๋ฐ ์ธ๋ผ์ธ์ด ๋งค์šฐ ์งง๊ณ  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

    • ์‚ฌ์šฉ๋จ: crypto/๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š” ์ผ์ •ํ•œ ํšŒ์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฆฌ๋ฒ„์Šค๋น„ํŠธ

    • ์žฅ์ : ?

    • ๋‹จ์ : ?

    • ์‚ฌ์šฉ ๋œ: ?

  • ์บ๋ฆฌ ๋ฆฌํ„ด์ด ์žˆ๋Š” ์ถ”๊ฐ€/๊ตฌ๋…

    • ์žฅ์ : ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋น„์‹ธ๋‹ค

    • ๋‹จ์ : ?

    • ์‚ฌ์šฉ: ์ˆ˜ํ•™/ํฐ

์—ญ์‚ฌ

1์›” 14์ผ: ์ธ์ˆ˜๊ฐ€ 0์ผ ๋•Œ TrailingZeros ๋ฐ LeadingZeros์˜ ์ถœ๋ ฅ์„ ๋ช…ํ™•ํžˆ ํ–ˆ์Šต๋‹ˆ๋‹ค.
1์›” 14์ผ: ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ: CountTrailingZeros -> TrailingZeros, CountLeadingZeros -> LeadingZeros, CountOnes -> Ones.
1์›” 13์ผ: ์•„ํ‚คํ…์ฒ˜ ์ด๋ฆ„์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
1์›” 11์ผ: ์ดˆ๊ธฐ ์ œ์•ˆ์„œ ๊ณต๊ฐœ.

FrozenDueToAge Proposal-Accepted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํšŒ์ „ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ขŒ์šฐ๋กœ ํšŒ์ „ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™ผ์ชฝ ํšŒ์ „๋งŒ ์ œ๊ณตํ•œ๋‹ค๋ฉด ์˜ค๋ฅธ์ชฝ ํšŒ์ „์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์€ ์˜ค๋ฅธ์ชฝ ํšŒ์ „์„ ์™ผ์ชฝ ํšŒ์ „์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ‘œํ˜„์‹์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ปดํ“จํ„ฐ๊ฐ€ ํ•˜์ฐฎ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œํ˜„์ด์ง€๋งŒ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์‹ค์ˆ˜๋ฅผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?

๋ชจ๋“  168 ๋Œ“๊ธ€

@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๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ตฌํ˜„์— ๋”ฐ๋ผ ์—ฌ์ „ํžˆ ์ถฉ๋ถ„ํžˆ ๋น ๋ฆ„)
  • ์ผ๋ถ€ ์ด๋ฆ„ ์ž์ „๊ฑฐ ํ˜๋ฆฌ๊ธฐ(๋‚˜๋Š” "Hacker's Delight" ์šฉ์–ด๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ ์ฒ ์ž๊ฐ€ ๋” ์ ์ ˆํ•  ์ˆ˜ ์žˆ์Œ)
  • ์ด ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์ˆ˜ํ•™/๋น„ํŠธ๋ณด๋‹ค ๋” ๋‚˜์€ ๊ณณ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@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)๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์„ธ ๊ฐ€์ง€ ์ด์œ :

  1. ์‚ฌ๋žŒ๋“ค์€ ํฌ๊ธฐ๊ฐ€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ตœ์†Œํ•œ ํ˜„์žฌ ์ปดํŒŒ์ผ๋Ÿฌ),
  2. ๋งŽ์€ ์œ ํ˜• ๋ณ€ํ™˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € uint32๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    uint64๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ๋‹ค์‹œ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฏธ๋ž˜์˜ ์ œ๋„ค๋ฆญ์„ ์œ„ํ•ด ์ œ๋„ค๋ฆญ ์ด๋ฆ„ SwapBytes๋ฅผ ์˜ˆ์•ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ํ•จ์ˆ˜์˜ ๋ฒ„์ „(Go๊ฐ€ ์ œ๋„ค๋ฆญ ์ง€์›์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ).

@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 ๊ฒฐ๊ณผ ์™ผ์ชฝ ํšŒ์ „
  • 0 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 ์ด์ „์—๋„ ์ž‘์—…ํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ?

18858, ์ฆ‰!

@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์„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๋Š” ์†”๋ฃจ์…˜์ด ๋‘ ๊ฐœ ์ด์ƒ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋นŒ๋“œ ํƒœ๊ทธ์™€ ์ ์ ˆํ•˜๊ฒŒ ๋ฆฌ๋””๋ ‰์…˜๋˜๋Š” uintptr ํ—ˆ์šฉ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ math/big์—์„œ word32.go ๋ฐ word64.go ํŒŒ์ผ์„ ์ •์˜ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ ์ธ๋ผ์ธ์ด ์˜ฌ๋ฐ”๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  2. 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/mul/etc ์˜ค๋ฒ„ํ”Œ๋กœ ์—ฌ๋ถ€ ํ…Œ์ŠคํŠธ
  • ๋“ค์–ด์˜ค๋Š” ์บ๋ฆฌ๋ฅผ ๋ฐ›์•„๋“ค์ด๊ณ  ๊ฒฐ๊ณผ์™€ ์บ๋ฆฌ(๋˜๋Š” ๋” ๋†’์€ ๋‹จ์–ด)๋ฅผ ์ƒ์„ฑํ•˜๋Š” add/mul/etc๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด "๋น„ํŠธ" ํŒจํ‚ค์ง€์— ์†ํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ๊ฐ€ ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์Œ). ๋‹ค์ค‘ ์ •๋ฐ€๋„ 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

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰