https://github.com/golang/go/issues/17373ããã³https://github.com/golang/go/issues/10757ã§ã®ä»¥åã®ãã£ã¹ã«ãã·ã§ã³
ãã®ææ¡ã§ã¯ãæŽæ°ãããããããããã®APIã®ã»ããã玹ä»ããŸãã
ãã®ææ¡ã§ã¯ãæŽæ°ãããããããããã®APIã®ã»ããã玹ä»ããŸãã ãã®ææ¡ã§ã¯ã次ã®æ©èœã«é¢å¿ããããŸãã
ãããã®æ©èœã¯ã調æ»ã«ãã£ãŠéžæãããŸããã
ä»ã®ããããåå ã§ããããã®4ã€ã®æ©èœã«éå®ããŸãã
ããªãã¯ã¯ãææ¡ãããã©ã€ãã©ãªã䜿çšããŠå®è£
ããã®ã¯éåžžã«ç°¡åã§ãã
ãŸãã¯ãã§ã«å©çšå¯èœãªGoã³ã³ã¹ãã©ã¯ãã
éžæããããããåãé¢æ°ã®ãµãã»ããã®å®è£
ãèŠã€ãããŸãã
ã©ã³ã¿ã€ã ãã³ã³ãã€ã©ãããŒã«ãå«ãå€ãã®ããã±ãŒãžã§ïŒ
| ããã±ãŒãž| clz | ctz | popcnt | bswap |
| --- | --- | --- | --- | --- |
| æ°åŠ/ããã°| X | X | | |
| ã©ã³ã¿ã€ã /å
éš/ sys | X | X | | X |
| ããŒã«/ã³ã³ãã/ã€ã³ã»ãã| X | | X | |
| cmd / compile / internal / ssa | X | | X | |
| code.google.com/p/intmath | X | X | | |
| github.com/hideo55/go-popcount | | | XïŒasmïŒ| |
| github.com/RoaringBitmap/roaring | | X | XïŒasmïŒ| |
| github.com/tHinqa/bitset | X | X | X | |
| github.com/willf/bitset | X | | XïŒasmïŒ| |
| gopl.io/ch2/popcount | | | X | |
| GCCãã«ãã€ã³| X | X | X | X |
ä»ã®å€ãã®ããã±ãŒãžã¯ããããã®é¢æ°ã®ãµãã»ãããå®è£ ããŠããŸãã
åæ§ã«ãããŒããŠã§ã¢ãããã€ããŒã¯éèŠæ§ãèªèããŠããŸã
ãã®ãããªæ©èœãšå«ãŸããŠãããã·ã³ã¬ãã«ã®ãµããŒãã®ã
ããŒããŠã§ã¢ã®ãµããŒãããªããã°ããããã®æäœã¯éåžžã«ã³ã¹ããããããŸãã
| ã¢ãŒã| clz | ctz | popcnt | bswap |
| --- | --- | --- | --- | --- |
| AMD64 | X | X | X | X |
| ARM | X | X | ïŒ | X |
| ARM64 | X | X | ïŒ | X |
| S390X | X | X | ïŒ | X |
popcntãé€ããã¹ãŠã®ããã調æŽé¢æ°ã¯ãruntime / internal / sysã«ãã£ãŠãã§ã«å®è£ ãããŠããããæé«ã®ããã©ãŒãã³ã¹ãåŸãã®ã«åœ¹ç«ã€ãããã«ã³ã³ãã€ã©ãŒããç¹å¥ãªãµããŒããåããŠããŸãã ãã ããã³ã³ãã€ã©ã®ãµããŒãã¯ã©ã³ã¿ã€ã ããã±ãŒãžã«éå®ãããŠãããä»ã®GolangãŠãŒã¶ãŒã¯ãããã®é¢æ°ã®é ãããªã¢ã³ããåå®è£ ããå¿ èŠããããŸãã
clzãctzãpopcntãããã³bswapé¢æ°ã®ã³ã³ãã€ã©/ããŒããŠã§ã¢æé©åå®è£
ãæäŸããããã«ã次ã®å€éšAPIãåããæ°ããstdã©ã€ãã©ãªmath/bits
ãå°å
¥ããŸãã
package bits
// SwapBytes16 reverses the order of bytes in a 16-bit integer.
func SwapBytes16(uint16) uint16
// SwapBytes32 reverses the order of bytes in a 32-bit integer.
func SwapBytes32(uint32) uint32
// SwapBytes64 reverses the order of bytes in a 64-bit integer.
func SwapBytes64(uint64) uint64
// TrailingZeros32 counts the number of trailing zeros in a 32-bit integer, and if all are zero, then 32.
func TrailingZeros32(uint32) uint
// TrailingZeros64 counts the number of trailing zeros in a 64-bit integer, and if all are zero, then 64.
func TrailingZeros64(uint64) uint
// LeadingZeros32 counts the number of trailing zeros in a 32-bit integer, and if all are zero, then 32.
func LeadingZeros32(uint32) uint
// LeadingZeros64 counts the number of trailing zeros in a 64-bit integer, and if all are zero, then 64.
func LeadingZeros64(uint64) uint
// Ones32 counts the number of bits set in a 32-bit integer.
func Ones32(uint32) uint
// Ones64 counts the number of bits set in a 64-bit integer.
func Ones64(uint64) uint
ãã®ææ¡ã®ä»£æ¿æ¡ã¯æ¬¡ã®ãšããã§ãã
ãã®ææ¡ã¯ãæ¢åã®stdlib APIãå€æŽãŸãã¯ç Žå£ããããšã¯ãªããäºææ§ã®ããã¬ã€ãã©ã€ã³ã«æºæ ããŠããŸãã
SwapBytesãTrailingZerosãLeadingZerosã¯ãã§ã«å®è£ ãããŠããŸãã äžè¶³ããŠããæ©èœã¯ãä»ã®æ©èœãšåæ§ã«å®è£ ã§ããæ©èœã ãã§ãã ãã®ææ¡ãåãå ¥ããããã°ãGo1.9ã«éã«åãããã«å®æœããããšãã§ããŸãã
ååã¯é£ããã§ããèªè»¢è»å°å±ã¯ã³ã¡ã³ãã«ãããŸãã
ã³ã¡ã³ãã«å«ããè¿œå æ©èœãææ¡ããŠãã ããã çæ³çã«ã¯ããã®ãããªé¢æ°ãstdlibïŒããšãã°ãmath / bigïŒãããŒã«ããŸãã¯äžè¬çãªããã±ãŒãžã§äœ¿çšãããå Žæãå«ããŠãã ããã
ãããŸã§ã«ã以äžã®æ©èœãææ¡ãããæ€èšãããŠããŸãã
14.JanïŒåŒæ°ã0ã®å Žåã®TrailingZerosãšLeadingZerosã®åºåãæ確ã«ããŸããã
1æ14æ¥ïŒã¡ãœããã®ååãå€æŽãããŸããïŒCountTrailingZeros-> TrailingZerosãCountLeadingZeros-> LeadingZerosãCountOnes-> Onesã
1æ13æ¥ïŒã¢ãŒããã¯ãã£åãä¿®æ£ããŸããã
1æ11æ¥ïŒæåã®ææ¡ãå
¬éãããŸããã
@brtzsnrãããããææ¡ããã»ã¹ã®ã¹ãããã§æŠèª¬ãããŠããããã«ããã®ããã¥ã¡ã³ããææ¡ãªããžããªã«éä¿¡ããå¿ èŠããã
ãã³ãã¬ãŒãã«ç¶ããŠãã§ã«ããŒã¯ããŠã³ãããŠãããããCLã«ã³ããŒã¢ã³ãããŒã¹ãããŠãã¡ã€ã«design / 18616-bit-twiddling.mdïŒãŸãã¯ãã®ä»ïŒãäœæããã®ã¯ç°¡åã§ãã
@cespare from https://github.com/golang/proposal ãäœæè ããã¶ã€ã³ããã¥ã¡ã³ããäœæãããå Žåã¯ãäœæã§ããŸããã ãã¶ã€ã³ããã¥ã¡ã³ããšããŠã¹ã¿ãŒãããŸããããæåºããããšããæ°æã¡ã匷ããã°å€§äžå€«ã§ãã
ç§ã¯ããã§å€§äžå€«ã ãšæããŸããããã¯å€ãã®ã¢ã«ãŽãªãºã ã©ã€ãã©ãªã§äœ¿çšãããååã«äžè¬çãªæ©èœã§ãããæ°åŠ/ãããã¯é©åãªå Žæã®ããã§ãã
ïŒ1ã€ã«ã¯ãmath / bigã¯nlzïŒ== clzïŒãå®è£ ããŸããïŒ
ååã«ã€ããŠã¯ãããããããã€ãã®èªè»¢è»ã®è±èœããããŸãã ç§ã¯ãé¢æ°ãäœããããããããäœãè¿ãããèšãæ¹ã奜ãã§ãã ããã«ãããååãçããªãå¯èœæ§ããããŸãã äŸãã°ïŒ
bits.TrailingZeros64(x)
ã§ã¯ãªãbits.CountTrailingZeros64(x)
ãªã©ãªã©ã
ææ¡ã¯ããªãæ確ã§æå°éã®ããã§ã-èšèšããã¥ã¡ã³ãã¯ããéãã®ããã§ãã çŸæç¹ã§ã¯CLã®æ¹ãé©åã ãšæããŸãã
ïŒããã¯ãAPIãšåºæ¬çãªå®è£ ãåããCLã§ããèšèšããã¥ã¡ã³ãã®ä»£ããã«è°è«ããããã§ãããã®ææ¡ãåãå ¥ãããã©ããã決å®ããå¿ èŠããããŸããïŒ
@brtzsnrã¯ãã§ã«èšèšããã¥ã¡ã³ããäœæããŠããŸããããã¯åé¡ã®èª¬æã«ããããã³ãã¬ãŒãã«åŸããŸãã ãããã®ããã¥ã¡ã³ãããã¹ãŠ1ãæã«ãŸãšããããšã«ã¯äœããã®äŸ¡å€ããããšæããŸããã
ããŒããŠã§ã¢ãµããŒãããŒãã«ã«ãªã¹ããããŠããæåŸã®ã¢ãŒãã¯ãBSWAPãã§ã-ã¿ã€ããã¹ïŒ
ãããæžããŠãããŠããããšãã
ctzããã³clzã®docæååã¯ã0ãæž¡ããããšãã®çµæãæå®ããå¿ èŠããããŸãã
ãŸããCountTrailingZeros32ãããTrailingZeros32ã®æ¹ã奜ãã§ãã Ctz32ã«ãæºè¶³ããŠããŸãã ããã¯ç°¡æœã§ãã»ãšãã©ã®äººã«éŠŽæã¿ããããæ®ãã®äººã¯ç°¡åã«ã°ãŒã°ã«ã§æ€çŽ¢ã§ããŸãã
ææ¡ããŠãããŠããããšãã
æ瀺ã ãã«çŠç¹ãåãããã®ã§ã¯ãªãããããã䜿çšã«ãçŠç¹ãåãããããšä»ãå ããããšæããŸãã ããšãã°ã @ dr2chaseã¯ãã³ã³ãã€ã©/ã¢ã»ã³ãã©ã«ããã€ãã®log2
é¢æ°ãããããšãäžåºŠèŠã€ããŸããã CLZã«è¿ãã§ãããåãã§ã¯ãããŸããã ãã®ãããªæ©èœã¯ããããããããããããããã±ãŒãžã«ãå«ãŸããŠããã¯ãã§ãã ãŸãããããã®æ瀺ã«é¢ä¿ã®ãªã䟿å©ãªæ©èœãå«ãŸããŠããå¯èœæ§ããããŸãã
ã«ãã£ãŠå®çŸ©ããããã¹ãŠã®ãããããããããªããã£ãã®ããã±ãŒãžãæäŸããã®ã¯ã©ãã§ãã
ããã«ãŒã®åã³ïŒ
ããã±ãŒãžãèšèšããéã«ãæ©èœãã©ãããèæ
®ããå¿
èŠã¯ãããŸããã
å
åšåããããšãããªãããšãã§ããŸãã æé©åã¯åŸã§è¡ãããšãã§ããŸãã ããã¯ã
äœã¬ãã«ã®å®è£
ã«é«ã¬ãã«ã®ããã±ãŒãžãå¶åŸ¡ãããªãã§ãã ãã
ã€ã³ã¿ãŒãã§ãŒã¹ã ããšããããã®ããã€ããã§ããªããšããŠããç§ãã¡ã¯è¯ãããã±ãŒãžã€ã³ã¿ãŒãã§ãŒã¹ãæãã§ããŸã
åäžã®åœä»€ã«ããããããŸãã
@minux ã幞ããªããšã«ããããŸã§ã«å¿ èŠã ã£ããã¹ãŠã®ããã調æŽé¢æ°ã¯ããŸãã«ãã®ææ¡ã«å«ãŸããŠãããã®ã§ãã
Hacker's Delightã«åŸãããšã«ã¯ãååã«ã€ããŠè°è«ããæéãç¡é§ã«ããå¿ èŠããªããšããå©ç¹ããããŸãã
以äžãè¿œå ããããšæããŸãã
ReverseBitsïŒuint32ããã³uint64ã®å ŽåïŒ
RotateLeft / RightïŒ2ã·ããã§ã€ã³ã©ã€ã³å±éã§ããŸãããã³ã³ãã€ã©ãŒ
ã·ããç¯å²ã®åé¡ã«ãããåžžã«å€æãå®è¡ã§ãããšã¯éããŸããïŒ
ãã¶ããå ç®ãšæžç®ã®2ã€ã®çµæ圢åŒããããŸããïŒ äŸãã°
func AddUint32ïŒxãyãcarryin uint32ïŒïŒcarryoutãsum uint32ïŒ//ãã£ãªãŒã€ã³ãã¹ã
0ãŸãã¯1ã«ãªããŸãã
ãããŠãuint64ã«ã€ããŠãåæ§ã§ãã
ãããŠSqrtIntã
ç§ã®ææ¡ã®å€ãã¯åäžã®åœä»€ã§å®è£
ããããšã¯ã§ããŸãããã
ããããã€ã³ãã§ãïŒç§ãã¡ã¯åãªããã®ã§ã¯ãªããã¡ãã£ãšãããããã±ãŒãžã欲ããã®ã§ã
intrisicsããã±ãŒãžã ããŒããŠã§ã¢ãé«ã¬ãã«ã®ããã±ãŒãžãå¶éããªãããã«ããŠãã ãã
ã€ã³ã¿ãŒãã§ãŒã¹ã
é¢é£ããŠãå ç®/ä¹ç®ããªãŒããŒãããŒãããã©ããããã§ãã¯ããé¢æ°ã
é¢é£ããããŒã¿ãã€ã³ãïŒããé«éãªcgoã®ããã«æåºãããããŸããŸãªåé¡ããããŸãã ãã®ãããªäŸã®1ã€ïŒææ¡ïŒ16051ïŒã§ã¯ãbsr / ctz / etcã®é«éå®è£ ãšããäºå®ã goãæžããŠãã人ã ãcgoã䜿ãããã£ãŠããäžé£ã®ãŠãŒã¹ã±ãŒã¹ã§ããŸãããã°æ¬ ããŠãããšèšããããããããŸããã
@aclementsã¯2016幎7æ1æ¥ã«ã³ã¡ã³ãããŸããïŒ
@eloff ããµããŒããããŠããå Žåã¯çµã¿èŸŒã¿é¢æ°ãšããŠã³ã³ãã€ã«ãããpopcountãbsrãªã©ã®é¢æ°ãè¿œå ããããã®ããã€ãã®è°è«ããããŸããïŒç§ã®ç¥ãéãå ·äœçãªææ¡ã¯ãããŸãããïŒïŒmath.Sqrtã¯ä»æ¥ã§ãïŒã 1.7ã§ã¯ãã©ã³ã¿ã€ã ã§ãããè©ŠããŠããŸããããã«ãããamd64SSAã§ctzçµã¿èŸŒã¿ã䜿çšã§ããããã«ãªããŸãã æããã«ãããã¯å šäœçãªåé¡ã解決ããããã§ã¯ãããŸãããããªãŒããŒãããã®å°ãªãã³ã³ããã¹ãã§cgoã䜿çšãããã1ã€ã®çç±ããããŸãã
ããã©ãŒãã³ã¹ã®ãããã§å€ãã®äººïŒç§ãå«ããŠïŒãè¡ãããã£ãŠããã®ã§ããã®çŸåšã®ã¡ãã£ãšãããããã®ææ¡ã®ãããªãã®ã圹ç«ã€ã§ãããã ïŒã¯ãã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))
}
次ã«ãïŒïŒ63ãä»ããŠïŒã³ã³ãã€ã©ãŒãkã®ç¯å²ãå¶éãããŠããããšãèªèããŠããããšã確èªã§ããŸãã
ãããã£ãŠãã³ã³ãã€ã©ãå
¥åãå¶éãããŠããããšã蚌æã§ããªãå Žåã¯ãè¿œå ã®ANDãå¿
èŠã§ãã ããã¯ãå転ã¢ã»ã³ããªããŸã£ããçæããªããããåªããŠããŸãã
éã«ã¯ã2017幎1æ13æ¥åå10æ37åPMã§ãããŒã¹ã»ã©ã³ããŒã«[email protected]
æžããŸããïŒ
@brtzsnr https://github.com/brtzsnrïŒMinuxãåç §ããŠãããã®ã ãšæããŸã
toã¯ãïŒ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ã§é«éåã§ããŸãã
23:24æéã2017幎1æ13æ¥ã«ã¯ã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ãã€ãã£ãå®è£ ããããŸãã äžæ¹ãrotateã¯ãã³ã³ãã€ã©ãèªèã§ããæ¹æ³ã§ã€ã³ã©ã€ã³ã§ç°¡åã«èšè¿°ã§ããŸãã
@minuxãšä»ã®ãã¹ãŠã®äººïŒäžå®ã§ãªãæ°ã®å転ãããã§å·Š/å³å転ã䜿çšãããå Žæãç¥ã£ãŠããŸããïŒ ããšãã°ãcrypto / sha256ã¯rotateã䜿çšããŸããããããæ°ã¯äžå®ã§ãã
å転ã¯ãã³ã³ãã€ã©ãèªèã§ããæ¹æ³ã§ã€ã³ã©ã€ã³ã§ç°¡åã«èšè¿°ã§ããŸãã
ã³ã³ãã€ã©ã®å éšã«ç²ŸéããŠãã人ã«ãšã£ãŠã¯ç°¡åã§ãã ãããæ°åŠ/ãããããã±ãŒãžã«å ¥ãããšã誰ã«ãšã£ãŠãç°¡åã«ãªããŸãã
å転ãããã®æ°ãäžå®ã§ãªãå Žåã«ãå·Š/å³å転ã䜿çšãããå Žæãç¥ã£ãŠããŸããïŒ
ïŒ9337ã®äŸã次ã«ç€ºããŸãã
https://play.golang.org/p/rmDG7MR5F9
ååŒã³åºãã§ã¯ãæ¯åäžå®æ°ã®ããŒããŒã·ã§ã³ããããããã§ãããé¢æ°èªäœã¯çŸåšã€ã³ã©ã€ã³åãããŠããªããããããŒããŒã·ã§ã³åœä»€ãªãã§ã³ã³ãã€ã«ãããŸãã æ°åŠ/ãããã©ã€ãã©ãªé¢æ°ã¯ééããªãããã§åœ¹ç«ã¡ãŸãã
åã§ã¯ã2017幎1æ14æ¥åå5æ05åAMã§ãã¢ã¬ã¯ãµã³ãã«MoÅoi [email protected]
æžããŸããïŒ
çŸåšææ¡ãããŠããé¢æ°ã«ã¯ãã¯ããã«å€§ããªGoãã€ãã£ãå®è£ ããããŸã
æé©ãããäžé£ãåãã«é«äŸ¡ã§ãã äžæ¹ãå転ããŸã
ã³ã³ãã€ã©ãèªèã§ããæ¹æ³ã§ã€ã³ã©ã€ã³ã§æžãã®ã¯ç°¡åã§ãããã®åé¡ã§äœåºŠã匷調ããããã«ãããã¯æ£ããæ¹æ³ã§ã¯ãããŸãã
Goããã±ãŒãžãèšèšããŸãã åºç€ãšãªãããŒããŠã§ã¢ãšã®çµã³ã€ãã匷ãããŸãã ç§ãã¡ãäœã
wantã¯ãäžè¬çã«åœ¹ç«ã€ã¡ãã£ãšãã調æŽããã±ãŒãžã§ãã ã©ãã«ã
é¢æ°ãåäžã®åœä»€ã«æ¡åŒµã§ããéããé¢ä¿ãããŸãã
APIã€ã³ã¿ãŒãã§ãŒã¹ã¯ããç¥ãããŠãããäžè¬çã«äŸ¿å©ã§ãã
@minux https://github.com/minuxãããŠä»ã®ã¿ããªïŒç¥ã£ãŠããŸãã
å·Š/å³å転ã¯ãäžå®æ°ã®å転ãããã§äœ¿çšãããŸããïŒ
ããšãã°ãcrypto / sha256ã¯rotateã䜿çšããŸããããããæ°ã¯äžå®ã§ããå®éã®åé¡ã§ã¯ãå転ã®ãããæ°ãäžå®ã§ãã£ãŠãã
ã³ã³ãã€ã©ã¯ãããèŠãããšãã§ããªããããããŸããã ã·ããã«ãŠã³ããä¿åãããŠããå Žåãªã©
é åå ããŸãã¯ã«ãŒãã«ãŠã³ã¿ãŒå ã«é衚瀺ããããã¯ã€ã³ã©ã€ã³åãããŠããªãåŒã³åºãå
é¢æ°ã
å¯å€æ°ã®å転ã䜿çšããç°¡åãªäŸã®1ã€ã¯ãèå³æ·±ããã®ã§ãã
popcountã®å®è£
ïŒ
// 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(x, y uint64) (c, s uint64)
ïŒ math/big
ãèŠããšãããããAdd(x, y uintptr) (c, s uintptr)
ãå¿
èŠã§ãã
rotãã€ã³ã©ã€ã³åãããŠããªãå Žåããã®äŸã¯æªãã€ã³ã©ã€ã³å決å®ã®ããã«èŠããŸãã
ã¯ãã ããã¯ãã€ã³ã©ã€ã³åã«ã€ããŠäžå¹³ãèšããã°ã®äžéšã§ãã :)
é¢æ°ãrot = funcïŒxãnïŒã§ã¯ãªãfunc rotïŒxãnïŒãšããŠèšè¿°ããããšããŸãããïŒ
ããã¯ç§ã®ã³ãŒãã§ã¯ãããŸãã-ãããŠããã¯èŠç¹ã®äžéšã§ãã ãããŠãšã«ãããããã¯åççãªã³ãŒãã§ãã
æå·åã¢ã«ãŽãªãºã ã§å®å šã«äœ¿çšã§ããããã«ãrotateé¢æ°ãšbyte-swapé¢æ°ãå®æ°æéã®æäœã§ããããšãïŒããã±ãŒãžã®ããã¥ã¡ã³ãã§ïŒä¿èšŒãããšäŸ¿å©ã§ãã ããããä»ã®æ©èœã«ã€ããŠãèããå¿ èŠããããŸãã
æšã§ã¯ã2017幎1æ19æ¥11:50ã§ããã€ã±ã«ã»Munday [email protected]
æžããŸããïŒ
ïŒããã±ãŒãžã®ããã¥ã¡ã³ãã§ïŒïŒ
ããŒããŒãããã³ãã€ãã¹ã¯ããé¢æ°ã¯å®æ°æéæäœã§ããããã
æå·ã¢ã«ãŽãªãºã ã§å®å šã«äœ¿çšã§ããŸãã ããããäœããèãã
ä»ã®æ©èœã«ãããã€ãã¹ã¯ããã®ç°¡åãªå®è£ ã¯å®æ°æéã§ãããåºç€ãšãªãã®ã¯
ã¢ãŒããã¯ãã£ã¯å¯å€ã·ããåœä»€ãæäŸããŸãããããã¯é£ããã§ããã
äžå®æéã®ããŒããŒã·ã§ã³ã®å®è£ ãä¿èšŒããŸãã ããããGoã¯å®è¡ãããŸãã
ãããããããã®ã¢ãŒããã¯ãã£ã§ã¯ã
ãšã¯èšããã®ã®ãæ ¹åºã«ãããšããç¡èŠã§ããªãå¯èœæ§ããããŸã
ãã€ã¯ãã¢ãŒããã¯ãã£ã¯ãã«ããµã€ã¯ã«ã·ãã¿ãŒã䜿çšããŠãããä¿èšŒã¯ã§ããŸãã
ãããã®å®è£
ã§ã¯äžå®ã®æéãããŒããŒã·ã§ã³ããŸãã
å³å¯ãªäžå®æéãå¿
èŠãªå Žåãããããå¯äžã®æ¹æ³ã¯æžã蟌ã¿ã¢ã»ã³ããªã§ã
ïŒãããŠãã®å Žåã§ããããã¯ãã¹ãŠã䜿çšãããŠãããšãã匷ãä»®å®ãããŸã
åœä»€èªäœã¯äžå®ã®æéã§ãããæé»çã«
ãã€ã¯ãã¢ãŒããã¯ãã£ãïŒ
ç§ã¯ãã®ãããªä¿èšŒã®å¿
èŠæ§ãç解ããŠããŸãããå®éã«ã¯ãããè¶
ããŠããŸã
ç§ãã¡ã®ã³ã³ãããŒã«ã
@minuxã«åæããåŸåããããŸãã äžå®æéã®æå·ããªããã£ããå¿ èŠãªå Žåããããã¯æå·/埮åŠã«ååšããå¿ èŠããããŸãã crypto / subtleã¯ããããã®å®è£ ãæ€èšŒãããŠãããã©ââãããã©ãŒã äžã®æ°åŠ/ãããã«ç°¡åã«ãªãã€ã¬ã¯ãã§ããŸãã é ããäžå®æéã®å®è£ ãå¿ èŠãªå Žåã¯ãä»ã®ããšãè¡ãããšãã§ããŸãã
ããã¯ãã䟡å€ãããããã§ãã @griesemerãš@ randall77ã«åããŠåºçºããŸãã 次ã®ã¹ãããã¯ãéåžžã®å Žæã«ãã§ãã¯ã€ã³ãããèšèšããã¥ã¡ã³ãã®ããã§ãïŒäžã®ã¹ã±ããã¯è¡šç€ºãããŠããŸãïŒã
ãã®ææ¡ãé²ããããšãã§ããããã«ãªã£ãã®ã§ãAPIã®è©³çŽ°ã«ã€ããŠåæããå¿ èŠããããŸãã ç§ãçŸæç¹ã§èŠãŠãã質åïŒ
uint64
ã uint32
ã®ã¿ããŸãã¯uint64
ã uint32
ã uint16
ã uint8
ããŸãã¯uintptr
ïŒïŒTrailingZeroesxx(x uintxx) uint
ãxx = 64ã32ãªã©ãvs TrailingZeroes(x uint64, size uint) uint
ããµã€ãºã¯64ã32ãªã©ã®ãããã-åŸè
ã®å ŽåãAPIãå°ãããªããããã§ãå®è£
ã«é¢ããŠã¯ååã«é«éã§ãïŒ@brtzsnrãã®åãçµã¿ã®å é ã«ç«ã¡ç¶ããŸããïŒ æåã®èšèšãæ¡çšããŠãã®å·ã§ç¹°ãè¿ãããå ŽåããŸãã¯å°çšã®èšèšããã¥ã¡ã³ããèšå®ãããå Žåã¯åé¡ãããŸããã ãŸãã¯ããããæã«åã£ãŠåã«é²ããããšãã§ããŸãã ç§ã¯ããã1.9ãã§ãŒãºã®éã«å ¥ãã®ãèŠãã®ã奜ãã§ãã
å人çã«ã¯ãã¹ãã«ã¢ãŠããããxxåã®æ¹ã奜ãã§ãïŒbits.TrailingZeroesïŒuint64ïŒxïŒã32ïŒã¯ãbits.TrailingZeroes32ïŒxïŒãimoãããæ±ãã«ãããèªã¿ã«ããããã®åœåã¹ããŒã ã¯ãã©ãããã©ãŒã å€æ°ãµã€ãºã§æ©èœããŸãuintptrãããç°¡åã«ãªããŸãïŒxx = PtrïŒïŒã
ãŸããããšãã°ãæåã®ãªãªãŒã¹ã«uint8ãå«ããªãã£ãããåŸã§è¿œå ããå Žåã¯ãããã«æ確ã«ãªããŸããçªç¶ã8ãè¿œå ããäžé£ã®æŽæ°ãããããã¥ã¡ã³ãã³ã¡ã³ãã®ä»£ããã«ãå€ãã®æ°ããxx = 8é¢æ°ããããŸããèŠéããã¡ãªãªãªãŒã¹ããã¥ã¡ã³ãã®ã¡ã¢ãšãšãã«ãæå¹ãªãµã€ãºã®ãªã¹ãã«ç§»åããŸãã
ã¹ãã«ã¢ãŠããããååã䜿çšãããŠããå Žåãééã£ãã¹ãã«ãæ€çŽ¢ããå Žåã«æ€çŽ¢ïŒããŒãžå ãŸãã¯æ€çŽ¢ãšã³ãžã³çµç±ïŒã§æ£èŠåãç°¡åã«èŠã€ããããããã«ãããã«ãŒã®åã³ã®çšèªããå¥åããšããŠèª¬æã«å«ããå¿ èŠããããšæããŸãã ã
æ°åŠ/ãããã¯çŽ æŽãããå Žæã ãšæããŸãâããã¯ãããã䜿ã£ãæ°åŠã§ãã
SwapBytes{16,32,64}
ã¯ã sync/atomic
ãããSwapBytes(..., bitSize uint)
sync/atomic
é¢æ°ãšã®æŽåæ§ãé«ãããšã«æ³šæããŠãã ããã
ãstrconv
ããã±ãŒãžã䜿çšãParseInt(..., bitSize int)
ãã¿ãŒã³ããéã®ããé¢é£ãããbits
ããã³atomic
ã§ãããããã strconv
ã
SwapBytesïŒuint64ãsize uintïŒãæ°ã«å ¥ããªã3ã€ã®çç±ïŒ
@griesemerãããŒããææ¡ãåŒãç¶ãã§ãã ããã ãã®ææ¡ã1ãæ以å ã«é²ããæéã¯ãããŸããããããŸã§ã¯é²å±ãæ¢ãŸããªãã¯ãã§ãã
ãã©ãŒã ã®çœ²åã«ã¯æ確ãªå¥œã¿ãããããã§ãã
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
ã¹ã¯ããé¢æ°ã®ã»ããããããããããŸããã å人çã«ç§ã¯ãããã«ã€ããŠæççã§ãïŒ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 has has
RBITåœä»€ã
@griesemer次ã®ãããªé¢æ°ã®å眲åã«é¢ããéã
func Ones64(x uint64) uint
func RotateLeft64(x uint64, n uint) uint64
RotateLeftN
ãªã©ã¯ãç°¡åã«å
åšåããããã«å¿
èŠãªããïŒå¯èœãªå ŽåïŒããŸãã¯ããããã¡ã€ã³ã§ãããšããçç±ã ãã§ãuintãåããŸããïŒ åŒ·ãæè¡çããŒãºããªãå Žåã¯ãè² ã®å€ãæå³ããªããªãå Žåã§ããintãååŸããããã®ãã匷åãªåäŸããããŸãã 匷ãæè¡çããŒãºãããå Žåããããã¯èŠåæ§ã®ããã®é©åãªNã®uintNã§ããå¿
èŠããããŸããïŒ
OnesN
ãšãã®åé¡ã¯ãããã§ãªãéãintãè¿ãå¿
èŠããããŸããããããªããšããããã®æŒç®ãä»ã®ãããæŒç®ãšçµã¿åãããããšãã§ããŸãããã®å Žåãé©åãªNã«å¯ŸããŠuintNãè¿ãå¿
èŠããããŸãã
@jimmyfrascheããã¯ãã¡ã€ã³ã ããã§ãã CPUã¯æ°ã«ããŸããã äœããintã§ãããuintã§ãããã¯ãæ¯èŒãé€ãã»ãšãã©ã®æäœã«ã¯é¢ä¿ãããŸããã ãšã¯ããããããintã«ãããšã決ããŠè² ã§ã¯ãªãïŒçµæïŒãè² ã§ãã£ãŠã¯ãªããªãïŒåŒæ°ïŒããŸãã¯è² ã®å Žåã«äœããã¹ããïŒå転ã®åŒæ°ïŒãæå®ããå¿ èŠããããŸãã ãã®å Žåã1åã®å転ã§éããããšãã§ãããããããŸããã
intã䜿çšãããšäœæ¥ãç°¡åã«ãªããšã¯æããŸããã é©åã«èšèšãããŠããå Žåãuintã¯uintã«æµãïŒmath / bigã®å ŽåïŒãå€æã¯å¿ èŠãããŸããã ãã ããå€æãå¿ èŠãªå Žåã§ããCPUã³ã¹ãã®ç¹ã§ã¯ç¡æã«ãªããŸãïŒèªã¿ãããã®ç¹ã§ã¯ãããŸãããïŒã
ããããããã§ãªããã°èª¬åŸåã®ããè°è«ãèãããèŠããããããšãã§ããŠããããã§ãã
å転ãããæ°ã¯ãïŒç¹å®ã®ãµã€ãºãªãã§ïŒuintã§ããå¿
èŠããããŸãã
èšèªã®ã·ããæŒç®åã
intã䜿çšããªãçç±ã¯ããã©ããããããŸãã«ãªãããã§ãã
RotateRight-2ãããã¯RotateLeft2ããããšåãã§ãã
@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ãããããŒããŒã·ã§ã³ã«å¯ŸããŠmod32ãå¹æçã«å®è¡ããŠããŸãã
å¯äžã®æ¬åœã®è°è«ã¯ãstdlibã®æ®ãã®éšåãšã®èŠåæ§ã§ãã uintãéåžžã«çã«ããªã£ãŠããå Žæã¯ãããããããŸããã代ããã«intã䜿çšãããŸãã
math / bigã¯æ³šç®ã«å€ããäŸå€ãªã®ã§ããããå¥ã®ãã®ã§ããããšã«åé¡ã¯ãããŸããããèæ ®ãã¹ãç¹ããããŸãã
@minuxã¯ãå®è£ ã®ãããŸããã§ã¯ãªããã³ãŒããèªãã ããããã°ããããã人ã«ãšã£ãŠã®ãããŸãããæå³ããŠãããš
ããã±ãŒãžã®ååããââã§ã«bitsãšåŒã°ããŠããå Žåãbits.SwapBitsã«ã¯å®éã«ããããµãã£ãã¯ã¹ãä»ããŠååãä»ããå¿ èŠããããŸããïŒ ãããã¹ã¯ããã¯ã©ãã§ããïŒ
ãã1ã€ã®ã¢ã€ãã¢ã¯ãbits.SwapBytesã§ã¯ãªãbits.SwapNïŒv uint64ãn intïŒã§ããããã§ãnã¯ãã¹ã¯ããã®ããã«ã°ã«ãŒãåãããããæ°ãè¡šããŸãã n = 1ã®å Žåãããããéã«ãªããn = 8ã®å Žåããã€ãã亀æãããŸãã 1ã€ã®å©ç¹ã¯ãbits.SwapBytesãååšããå¿ èŠããªããªã£ãããšã§ãããã ããä»ã®nã®å€ãå¿ èŠã«ãªãããšã¯äžåºŠãèŠãããšããããŸããããä»ã®äººãåæããªãå¯èœæ§ããããŸãã
äžã§LeadingZeros64
ã TrailingZeros64
ã Ones64
ãã¹ãŠã®LGTMã
眲åãããããŒããŒã·ã§ã³éé¡ãæã€åäžã®Rotate64
ã¯é
åçã§ãã ã»ãšãã©ã®å転ãäžå®éã§è¡ããããããïŒãããçµã¿èŸŒã¿ã«ãªãå ŽåïŒãåå¥ã®å³/å·Šé¢æ°ã䜿çšããªãããšã«ããå®è¡æã®ã³ã¹ãã¯çºçããŸããã
ããã/ãã€ãã®ã·ã£ããã«/ã¹ã¯ããã³ã°/ãªããŒã¹ã«ã€ããŠã¯åŒ·ãæèŠã¯ãããŸããã ããããéã«ããããã«ã bits.Reverse64
ã¯ããè¯ãååã®ããã§ãã ãããŠããããbits.ReverseBytes64
ïŒ Swap64
ã¯å°ãäžæçã ãšæããŸãã Swap64
ã«ã°ã«ãŒããµã€ãºããšãããããšã®é
åã¯ããããŸãããã°ã«ãŒããµã€ãºã64ãåçã«åå²ããªãå Žåã®åäœã¯ã©ããªããŸããïŒ éèŠãªã°ã«ãŒããµã€ãºã1
ãš8
ã ãã®å Žåã¯ããããã«å¥ã
ã®é¢æ°ãäžããæ¹ãç°¡åã§ãã ãŸããããçš®ã®äžè¬çãªããããã£ãŒã«ãæäœã®æ¹ãåªããŠããã®ã§ã¯ãªãããšæããŸãããããããarm64ããã³amd64BMI2ã®åœä»€ãåèã«ããŠãã ããã
æŽæ°ã®æ°åŠé¢æ°ããã®ããã±ãŒãžã«å«ãŸããŠãããšã¯æããŸããã ãããã¯ãå®è£
ã§ãããé¢æ°ã䜿çšã§ããããã±ãŒãžæ°åŠã«å±ããŠããããã«èŠããŸãã é¢é£ããŠããªãfunc Sqrt(x uint64) uint32
ïŒ uint64
ãè¿ã代ããã«ïŒã§ã¯ãªãã®ã§ããïŒ
AddUint32
ãšåéã¯è€éã§ãããæçµçã«ã¯å蚪ããããšæããŸãã ä»ã®ããšã«å ããŠã MulUint64
ã¯HMULãžã®ã¢ã¯ã»ã¹ãæäŸããŸããHMULã¯ãè¶
ããããªã¹ãã®RISC-VISAã§ããåœä»€ãšããŠæäŸãããŸãã ããããã¯ããæåã«äœããååŸããŸãããã åŸã§ãã€ã§ãæ¡åŒµã§ããŸãã
bits
ã¯æããã«æ£ããããã±ãŒãžåã®ããã§ãã ã€ã³ããŒããã¹ã¯math/bits
ã§ã¯ãªãbits
ã§ããå¿
èŠããããšèšããããªããŸãããç§ã¯åŒ·ãæããŸããã
ãããã¯æããã«æ£ããããã±ãŒãžåã®ããã§ãã ã€ã³ããŒããã¹ã¯æ°åŠ/ãããã§ã¯ãªããããã ãã§ããå¿ èŠããããšèšããããªããŸãããç§ã¯åŒ·ãæããŠããŸããã
IMOããããbits
ã ãã ã£ãå ŽåãïŒããã±ãŒãžã®ããã¥ã¡ã³ããèªãŸãã«ïŒããã±ãŒãžbytes
ãããã䌌ãŠãããšæããŸãã ã€ãŸããããããæäœããé¢æ°ã«å ããŠããã€ãã¹ããªãŒã ãšã®éã§ããããèªã¿æžãããããã®Reader
ãšWriter
ãèŠã€ãããšæããŸãã math/bits
ãããšãã¹ããŒãã¬ã¹é¢æ°ã®ã»ããã ããããæ確ã«ãªããŸãã
ïŒãããã¹ããªãŒã çšã«ãªãŒããŒ/ã©ã€ã¿ãŒãè¿œå ããããšã¯ææ¡ããŠããŸããïŒ
眲åãããå転éãæã€åäžã®Rotate64ã¯é åçã§ãã ã»ãšãã©ã®å転ãäžå®éã§è¡ããããããïŒãããçµã¿èŸŒã¿ã«ãªãå ŽåïŒãåå¥ã®å³/å·Šé¢æ°ã䜿çšããªãããšã«ããå®è¡æã®ã³ã¹ãã¯çºçããŸããã
å·Š/å³å転ã1ã€ã®Rotate
ã«çµã¿åãããããšã§ãããã±ãŒãžAPIãå°ãå°ãããããšäŸ¿å©ãªããšãããããŸããã n
ãã©ã¡ãŒã¿ãŒãå¹æçã«ææžåããããšãã§ããŸãã次ã®ããšã瀺ããŸãã
n
ã¯ãå·Šå転ã«ãªããŸãn
ã¯å€æŽãããŸããn
ã¯ãå³å転ã«ãªããŸãç§ã«ã¯ãè¿œå ãããã¡ã³ã¿ã«ãšããã¥ã¡ã³ãã®ãªãŒããŒãããã¯ã2ã€ã1ã€ã®Rotate
çµåããããšãæ£åœåããããã«ã¯æããŸããã æ瀺çãªRotateLeft
ãšRotateRight
ïŒ n
ã¯uint
ãšãããçŽæçã«ãªããŸãã
@mdlayher nãããã¯ãŒããå·Šã«kãããå転ãããããšã¯ãnkããããå³ã«å転ãããããšãšåãã§ããããšã«
ãã®äžãããŒããŠã§ã¢ïŒx86ãªã©ïŒã¯ãkãäžå®ã§ãªãå Žåã§ãããããèªåçã«å®è¡ããŸãã
@griesemer ã Rotate
æ¬ ç¹ã¯ãã©ã¡ãã®æ¹åãæ£ã§ããããããããªãããšã§ãã Rotate32(1, 1)
2ãŸãã¯0x80000000ã«çããã§ããïŒ ããšãã°ãããã䜿çšããã³ãŒããèªãã§ããå Žåãçµæã¯2ã«ãªããšäºæ³ãããŸããã @ mdlayherã¯0x80000000ã«ãªããšäºæ³ããŠããããã§ãã äžæ¹ã RotateLeft
ãšRotateRight
ã¯ã笊å·ä»ããŸãã¯ç¬Šå·ãªãã®åŒæ°ãåããã©ããã«é¢ä¿ãªããæ確ãªååã§ãã ïŒ @minuxã«ã¯ãRotateRight by-2ãRotateLeft2ãšçãããã©ããããããŸãã§ããããšã«åæããŸããããããã¯æããã«ç§ãšåçã®ããã§ãããä»ã«ã©ã®ããã«æå®ã§ãããããããŸãããïŒ
RotateLeft64ãšåŒã°ããé¢æ°ã1ã€ã ãæã¡ãè² ã®å€ã䜿çšããŠå³ã«å転ããããšã§ä¿®æ£ã§ãã
æã£ãŠããå°ãå¥åŠã«æãããã®ã®@josharianã¯ãç§ã¯ãåæRotateLeft
ãããã«RotateRight
ã å転ãèšç®ãããå Žåã笊å·ä»ãå転ãæã€ããšã®äžè²«æ§ã¯æœåšçã«äŸ¡å€ãããããã«èŠããŸãããäžå®ã®å転ã®å Žåããè² ã®2ããããåè«ã§å·Šã«å転ããããããã2ãããå³ã«å転ããããšããã³ãŒããèªã¿ãããšæããŸãã
ããã¥ã¡ã³ãã§ãããä¿®æ£ããéã®åé¡ã¯ãããã¥ã¡ã³ããé¢æ°ãåŒã³åºãã³ãŒãã®èªã¿ããããå©ããªãããšã§ãã
ã³ãŒããæžããŠãã人ã¯ãå·Šã«å転ããããå³ã«å転ãããããããšæã£ãŠããŸãã ããã«å¿ããŠã圌ãã¯å·Šã«ãå³ã«ãå転ããããããŸããã å·Šå転ã®ã¿ãæäŸããå Žåãå³å転ãåžæãã人ã¯ãå³å転ãå·Šå転ã«å€æããåŒãäœæããå¿ èŠããããŸãã ããã¯ãã³ã³ãã¥ãŒã¿ãŒãç°¡åã«å®è¡ã§ããçš®é¡ã®è¡šçŸã§ãããããã°ã©ããŒã¯ééããç¯ããŸãã ãªãããã°ã©ããŒã«èªåã§æžãããã®ã§ããããïŒ
ç§ã¯ç¢ºä¿¡ããŠããŸãã
@ aclements @ ianlancetaylorãã€ã³ããååŸããŸããã ïŒãšã¯ãããRotateLeft / Rightã®å®è£ ã¯ããããããrotateã®1ã€ã®å®è£ ãåŒã³åºãã ãã§ããïŒ
ååã®ã¢ã€ãã¢ã¯ã眲ååã§ã¯ãªãããã±ãŒãžåã«ã¿ã€ããå
¥ããããšã§ãã bits64.Ones
ã§ã¯ãªãbits.Ones64
ã
@btracey ãç§ã¯ããã«å°ãå£ã®äžã«æããŸããã :) flag64.Int
ãŸãã¯math64.Floatfrombits
ãŸãã¯sort64.Floats
ãŸãã¯atomic64.StoreInt
ã¯ãããŸããã
@ bradfitzgolang.org/x/image/math/f64ãšgolang.org/x/image/math/f32ã¯ååšããŸãã
ç§ã¯atomic
ãåäŸãšããŠèããŠããŸããã§ããïŒãããããããšã«ãç§ã®éåžžã®Goã®äœ¿çšæ³ã§ã¯ãããŸããïŒã ä»ã®äŸã¯ãããã±ãŒãžãå€ãã®ç°ãªãã¿ã€ãã«å¯ŸããŠç¹°ãè¿ãããé¢æ°ã®ã»ããããã倧ãããããç°ãªããŸãã
bits64
ã«ã¢ã¯ã»ã¹ããŠè¡šç€ºãããšãããã¥ã¡ã³ããèŠããããªããŸãïŒããšãã°ãgodocã§ïŒã
Ones
LeadingZeros
TrailingZeros
bits
ã«è¡ã£ãŠèŠã代ããã«
Ones8
Ones16
Ones32
Ones64
LeadingZeros8
...
@iand ããããããªãã°ãã¹ã§ãã 32ãš64ã¯ãAffãMatãããã³Vecã®æ¢åã®ãã¹ãŠã®æ°å€æ¥å°ŸèŸã«èŠæ ãããããªãã£ããšæããŸãã ããã§ããããã¯éåžžã®Goã¹ã¿ã€ã«ã§ã¯ãªãäŸå€ã ãšæããŸãã
Goã«ã¯ãpkg64.fooã§ã¯ãªãpkg.foo64åœåã¹ã¿ã€ã«ã䜿çšãããšããããªã匷åãªåäŸããããŸãã
nåã®ã¿ã€ããããå Žåãããã±ãŒãžAPIã¯nå倧ãããªããŸãããAPIã®è€éãã¯ããã§ã¯ãããŸããã ããã解決ããããã®ããè¯ãã¢ãããŒãã¯ãããã¥ã¡ã³ããšãgodocãªã©ã®ããŒã«ãä»ããŠ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ãããèªã¿ããããªã£ãŠããŸãïŒLog2ã¯ããã«å±ããŠãããšæããŸã-ãããŠããã±ãŒãžã®åœåã¯ãããæé€ããè¯ãçç±ã§ã¯ãããŸããïŒ
çµå±ãããã¯ã¹ã«ã©ãŒã¿ã€ãã«ãã£ãŠããã©ã¡ãŒã¿åããããåã¿ã€ãã®åãAPIã§ãããããé¢æ°ãã¿ã€ãéã§åãååãæã£ãŠããå Žåãã³ãŒãã¯å¥ã ã®ããã±ãŒãžã§ãªãã¡ã¯ã¿ãªã³ã°ããã®ãç°¡åã§ã-ã€ã³ããŒããã¹ãå€æŽããã ãã§ãïŒåèªå šäœã®çœ®æã¯gofmt -rã䜿çšãããšç°¡åã§ãããã«ã¹ã¿ã ãµãã£ãã¯ã¹å€æã¯ããåä»ã§ãïŒã
é¢æ°åã®ããããµã€ãºã®æ¥å°ŸèŸã¯æ £çšçãªãã®ã§ããå¯èœæ§ããããšãã@griesmeyerã«åæããŸãããã¿ã€ãã«äŸåããªãéèŠãªã³ãŒããããã±ãŒãžã«å«ãŸããŠããå Žåã«ã®ã¿ãããã ãã®äŸ¡å€ããããšæããŸãã
ãšã³ã³ãŒãã£ã³ã°/ãã€ããªããéã³ãçã¿ãé¢é£ããäºåå®çŸ©ãããã¿ã€ããåãå ¥ããã¡ãœãããæã€Uint64ãUint32ã...ãšããååã®å€æ°ãäœæããããšãã§ããŸãã
ããã.Uint64.RightShift
ããã.Uint8ããªããŒã¹
bits.Uintptr.Log2
..ã
@griesemerã©ã®ããã«ããããã°ã«ãŒãåããæ¹æ³ãç¥ã£ãŠããã§ããããïŒ ããã¥ã¡ã³ãå ã§å®éã®ååã®ä»£ããã«é¢æ°åãNã§çµãã1ã€ã®ããã¥ã¡ã³ãæååã§ãäžäžèŽã«äžèŽããããã¥ã¡ã³ãæååã®ãªãé¢æ°éã§å ±éã®ãã¬ãã£ãã¯ã¹ãèŠã€ããŸããïŒ ããã¯ã©ã®ããã«äžè¬åãããŸããïŒ éåžžã«å°æ°ã®ããã±ãŒãžãæäŸããã®ã¯è€éãªç¹æ®ãªã±ãŒã¹ã®ããã§ãã
@rogpeppeããã¯
@nerdatmathããã¯ããšã³ã³ãŒãã£ã³ã°/ãã€ããªã®å Žåã®ããã«ãå£èªçãªæå³ã§ã¯åãã€ã³ã¿ãŒãã§ã€ã¹ãæã¡ãŸãããGoã®æå³ã§ã¯ãªãããããããã«ç°ãªããŸãïŒã©ã¡ããbinary.ByteOrderãå®è£ ããŸãïŒããããã£ãŠãå€æ°ã¯åå空éçšã«ãªããŸãããããŠãgodocã¯ãåããšã¯ã¹ããŒããããªãéããã©ã®ã¡ãœãããååŸããŸããïŒïŒ7823ïŒãããã¯å¥ã®æ¹æ³ã§é¢åã§ãã
ãµã€ãºã®æ¥å°ŸèŸã¯åé¡ãããŸããããå šäœãšããŠãåå¥ã®ããã±ãŒãžã䜿çšããããšæããŸãã ãããããã®ã³ã¡ã³ããè¶ ããŠãããããã·ã¥ããããšãããããããã®ã«ååã§ã¯ãããŸããã
@nerdatmathãvarsã®å Žåããããã¯å€æŽå¯èœã§ããïŒ bits.Uint64 = bits.Uint8
å®è¡ã§ããŸãïŒãã³ã³ãã€ã©ãŒãããããçµã¿èŸŒã¿é¢æ°ãšããŠæ±ãã®ãé²ããŸããããã¯ãããã±ãŒãžïŒã®å°ãªããšãäžéšïŒã®åæ©ã®1ã€ã§ããã
å€æ°ããšã¯ã¹ããŒããããŠããªãã¿ã€ãã§ãããç¶æ ããªãå ŽåïŒãšã¯ã¹ããŒããããŠããªã空ã®æ§é äœïŒãå€æ°ã¯å®éã«ã¯å€æŽã§ããŸããã ããããå ±éã®ã€ã³ã¿ãŒãã§ãŒã¹ããªããã°ãgodocïŒä»æ¥ïŒã¯ã²ã©ããã®ã«ãªãã§ãããã ãããçããªãä¿®æ£å¯èœã§ãã
ãã ãããã¹ãŠãè€æ°ã®ããã±ãŒãžã䜿çšããããšã«ãªã£ãå Žåã§ãããããä¿èšŒããã®ã«ååãªç¹°ãè¿ããšããªã¥ãŒã ãããå Žåã¯ãå°ãªããšããX / bits / int64sãããX / bits / intsãããX /ãã®ããã«ããã±ãŒãžã«ååãä»ããŠãã ããã ããšã©ãŒãããæååããããã€ããã«äžèŽãããããã/ int32sãã ãŸã å€ãã®ããã±ãŒãžççºã®ããã§ãã
è€æ°ã®ã¿ã€ãåºæã®ããã±ãŒãžãžã®ãã¹ã«é²ãã¹ãã§ã¯ãªããšæããŸããåäžã®ããã±ãŒãžããããæã€ããšã¯åçŽã§ãããGoã©ã€ãã©ãªå ã®ããã±ãŒãžã®æ°ãå¢ããããšã¯ãããŸããã
Ones64ãšTrailingZeroes64ã¯è¯ãååã§ã¯ãªããšæããŸãã 圌ãã¯åœŒããã«ãŠã³ããè¿ãããšãç¥ãããŸããã ãã¬ãã£ãã¯ã¹Countãè¿œå ãããšãååãããã«é·ããªããŸãã ç§ã®ããã°ã©ã ã§ã¯ããããã®é¢æ°ã¯å€§ããªåŒã«åã蟌ãŸããŠããããšãå€ããããé¢æ°åãçããããšèªã¿ããããªããŸãã ãHacker'sDelightããšããæ¬ã®ååã䜿çšããŸãããã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
ã¯ãåªããã°ããŒãã«ããããã£ããã§ã«å€±ãããŠãããããããŸã圹ã«ç«ã¡ãŸããã
ç§ã¯ãã£ãã«ãããã¬ãã«ã®ãã®ãããããŸããã èããªããã°ãªããªãã£ãã®ã¯äœå¹Žãåã®ããšãªã®ã§ãæ¯åãã®ãããªãã®ããããã調ã¹ãªããã°ãªããªãã®ã§ãããã«ãŒã®åã³/ asmã¹ã¿ã€ã«ã®ååã¯ãã¹ãŠè ¹ç«ãããã»ã©äžå¯è§£ã§ãã å¿ èŠãªãã®ãèŠã€ããŠããã°ã©ãã³ã°ã«æ»ãããšãã§ããããã«ããããäœãããããèšã£ãã ãã§ãã
ç§ã¯@ulikunitzã«åæã
init() instead of initialize(),
func instead of function
os instead of operatingsystem
proc instead of process
chan instead of channel
ããã«ãç§ã¯ãã®ãããã«ææŠããŸããTrailingZeroes64ã¯èªå·±ææžåã§ãã ãŒããæ«å°Ÿã«ãããšã¯ã©ãããæå³ã§ããïŒ èªå·±ææžåããããã£ã¯ããŠãŒã¶ãŒãæåã«ææžåã®ã»ãã³ãã£ã¯ã¹ã«ã€ããŠäœããç¥ã£ãŠããããšãåæãšããŠååšããŸãã äžè²«æ§ãä¿ã€ããã«Hacker'sDelightã䜿çšããŠããªãå Žåã¯ãRotateRight64ãšRotateLeft64ã«äžèŽããããã«ZeroesRight64ãšZeroesLeft64ãšåŒãã§ã¿ãŸãããïŒ
æ確ã«ããããã«ãç§ã¯ããã䜿çšãããšãã¯ãã€ã§ãæåã«ãã¹ãããšã¯çããšã€ãªã¢ã¹ãäœæããããšã§ãããäžããããååã決ããŠäœ¿çšããŠã¯ãªããªãããšãæå³ããã€ããã¯ãããŸããã§ããã ã€ãŸããç¹°ãè¿ã䜿çšããŠããå Žåã¯ãã³ãŒãã®å¯èªæ§ãåäžããã°ããšã€ãªã¢ã¹ãäœæã§ããŸãã
ããšãã°ãstrings.HasSuffixãåŒã³åºãå Žåã1åãŸãã¯2ååŒã³åºããããã»ãšãã©ã®å Žåãæå®ãããååã䜿çšããŸããã1åéãã®ETLã¹ã¯ãªãããªã©ã§æã
䜿çšããŸããæçµçã«ã¯ãããæãšåŒã¶ããšã«ãªããŸãã®ã§ã ends := strings.HasSuffix
ãå®è¡ããŸããããã¯çããã³ãŒããæ確ã«ãªããŸãã ãšã€ãªã¢ã¹ã®å®çŸ©ãããè¿ãã«ããã®ã§åé¡ãããŸããã
éåžžã«äžè¬çãªãã®ã«ã¯ãçç¥åã§ååã§ãã å€ãã®éããã°ã©ããŒã¯OSã®æå³ãç¥ã£ãŠããŸãã Goãç¥ããªããŠããã³ãŒããèªãã§ãã人ã¯èª°ã§ããfuncãé¢æ°ã®ç¥ã§ããããšã«æ°ä»ãã§ãããã ãã£ã³ãã«ã¯Goã®åºæ¬ã§ãããåºã䜿çšãããŠããã®ã§ãchanã¯åé¡ãããŸããã ãããé¢æ°ã極端ã«äžè¬çã«ãªãããšã¯æ±ºããŠãããŸããã
TrailingZeroesã¯ãæŠå¿µã«æ £ããŠããªãå Žåãäœãèµ·ãã£ãŠããã®ããæ£ç¢ºã«äŒããããšãã§ããªãå ŽåããããŸãããå°ãªããšã倧ãŸãã«èšã£ãŠãCtzãããã¯ããã«åªããã¢ã€ãã¢ãæäŸããŸãã
@jimmyfrasche https://github.com/golang/go/issues/18616#issuecomment -275828661ã«ã€ããŠïŒgo / docã¯ãååããã¹ãŠã§å§ãŸãåããã¡ã€ã«å ã®é£ç¶ããäžé£ã®é¢æ°ãèªèããã®ã¯éåžžã«ç°¡åã§ããåãæ¥é èŸããããæ°åã®ã·ãŒã±ã³ã¹ã§ããæ¥å°ŸèŸããæ¥é èŸã«å¯ŸããŠãçããåèªã§ããå¯èœæ§ããããŸãã ãããã®é¢æ°ã®æåã®é¢æ°ã ããããã¥ã¡ã³ãæååãæã¡ãäžèŽãããã¬ãã£ãã¯ã¹ãæã€ä»ã®é¢æ°ã¯æã£ãŠããªããšããäºå®ãšçµã¿åãããŸãã ããã¯ãããäžè¬çãªèšå®ã§éåžžã«ããŸãæ©èœãããšæããŸãã ããã¯èšã£ãŠãããã®ææ¡ãä¹ã£åããªãããã«ãä»ã®å Žæã§ããã«ã€ããŠè©±ãåããŸãããã
åèãŸã§ã«ã go/doc
å€æŽã«ã€ããŠè©±ãåãããã®äŒè©±ããããšã¯å¥ã«ããããã«ïŒ18858ãäœæããŸããã
@mdlayherãããããŠãããŠããããšãã
@rogpeppeããã±ãŒãžåã«ãµã€ãºãå ¥ããã®ã¯
@ulikunitzç§ã¯éåžžãçãååã«æåã«æ祚ãã人ã®1人ã§ãã ç¹ã«ããŒã«ã«ã³ã³ããã¹ãïŒããã³éåžžã«é »ç¹ã«äœ¿çšãããååã®ã°ããŒãã«ã³ã³ããã¹ãïŒã§ã ããããããã«ã¯ããã±ãŒãžAPIããããïŒå°ãªããšãç§ã®çµéšã§ã¯ïŒé¢æ°ã¯ã¯ã©ã€ã¢ã³ãã«åºã衚瀺ãããŸããã ããšãã°ãmath / big makeã¯LeadingZerosãLog2ãªã©ã䜿çšããŸãããããã¯1ã€ã2ã€ã®åŒã³åºãã«ãããŸããã é·ã説æçãªååã§ã倧äžå€«ã ãšæããŸããè°è«ããå€æãããšãã³ã¡ã³ãã®å€§éšåã¯ãããæ¯æããŠããŸãã é¢æ°ãé »ç¹ã«åŒã³åºãå Žåã¯ãçãååã®é¢æ°ã§ã©ããããæ¹ãå®äŸ¡ã§ãã è¿œå ã®é話ã¯ã€ã³ã©ã€ã³åãããŸãã FWIWãIntelã®ããŒã¢ããã¯ãçŽ æŽããããã®ã§ã¯ãªãããã«ãŠã³ããïŒcntïŒã«éç¹ã眮ãããŠããããã埩å·åããå¿ èŠã®ãã2æåãæ®ããŸãã
Log2ã®2ã¯å¿
èŠãªãããšã«åæããŸãã bits.Log
ã¯ã2ã®åºãæå³ããŸãã
bits.Log64SGTMã
@griesemerç§ã®ã«ãããªãã»ã³ãã³ã¹ã¯ãããããäžåšçšãªç·šéã®ã¢ãŒãã£ãã¡ã¯ãã§ããã åãå€ãããšããã§ãã
@griesemerååã®èªè»¢è»ã®è±èœãç¶ãã䟡å€ããããã©ãã
@ulikunitzããã§ã®ãã£ãŒãããã¯ã®å€§éšåã¯ãã·ã§ãŒãã«ããã§ã¯ãªãæ確ãªé¢æ°åãæ¯æããŠãããšæããŸãã
@ulikunitz ãããã«ïŒ
ããã±ãŒãžbigã¯ãLeadingZerosã§ã¯ãªãnlzãå éšçã«äœ¿çšããŸãã
å éšã®ãã©ã€ããŒããªãšã¯ã¹ããŒããããŠããªãååã¯ãããã§ã¯åœ±é¿ãäžããŸããã
éèŠãªã®ã¯ããããªãã¯APIã®äžè²«æ§ãšæšæºçãªæ觊ã§ãã
ãã€ã¯ã·ã§ãã£ã³ã°ã¯ç ©ããããããããŸããããç§ãã¡ãæ°žé ã«ãããã«åºå·ãããšãã¯ååãéèŠã§ãã
CLhttps ïŒ //golang.org/cl/36315ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
ã¬ãã¥ãŒçšã®åæïŒéšåçã«ãã¹ãæžã¿ïŒAPIïŒäºåå®è£ ããïŒãšããŠhttps://go-review.googlesource.com/#/c/36315/ãã¢ããããŒãããŸããïŒèšèšããã¥ã¡ã³ãã®ä»£ããã«ïŒã
APIãæ£ããããšã確èªããŠããã®ã§ãä»ã®ãšããAPIïŒbits.goïŒã«ã€ããŠã®ã¿ã³ã¡ã³ãããŠãã ããã ãã€ããŒãªåé¡ïŒã¿ã€ããã¹ãªã©ïŒã«ã€ããŠã¯ãCLã«ã³ã¡ã³ãããŠãã ããã ãã¶ã€ã³ã®åé¡ã«ã€ããŠã¯ããã®åé¡ã«ã€ããŠã³ã¡ã³ãããŠãã ããã ã€ã³ã¿ãŒãã§ã€ã¹ã«æºè¶³ãããŸã§ãCLãæŽæ°ãç¶ããŸãã
å ·äœçã«ã¯ãå®è£ ã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããã ããã¯åºæ¬çãªãã®ã§ãããéšåçã«ãããã¹ããããŠããŸããã APIã«æºè¶³ããããå®è£ ãç°¡åã«æ¡åŒµã§ããŸãã
@griesemer倧äžå€«ã ãšæããŸãããããã圹ç«ã€å Žåã¯ããã¹ãä»ãã®CLZã¢ã»ã³ããªã®å®è£ ããããŸãhttps://github.com/ericlagergren/decimal/tree/ba42df4f517084ca27f8017acfaeb69629a090fb/internal/arithçã/ããã/äœã§ãã
@ericlagergrenãªã³ã¯ãããããšãã APIãèœã¡çããããããå Žæã§ãã¹ããå®æœãããããå®è£ ã®æé©åãéå§ã§ããŸãã ç§ã¯ãããå¿ã«çããŠãããŸãã ããããšãã
@griesemer ãææ¡ãããAPIããã¥ã¡ã³ãã¯ãåããã¬ãã£ãã¯ã¹ã§æŽæ°ã®ãµãã£ãã¯ã¹ãæã€é¢æ°ãé©åã«ããã¥ã¡ã³ãåã§ããgo / docã«äŸåããŠããããã§ãã
1.9ããåã«ãããã«åãçµãèšç»ã¯ãããŸããïŒ
@mdlayherããã¯çæ³çã§ãã ãã ããAPIã«ã¯åœ±é¿ããããå¯äžã®ãããã¥ã¡ã³ãã«åœ±é¿ãããããç®ãèŠåŒµããã®ã«ã¯ãªããŸããïŒä»åŸãäžäœäºææ§ãç¶æããå¿ èŠããããŸãïŒã
@ griesemer @ bradfitzé¢æ°åã«é¢ããèªåã®ç«å Žãåèããããã«æéãè²»ãããŠããŸãã ååãéžæããéèŠãªç®çã¯ãAPIã䜿çšããã³ãŒãã®å¯èªæ§ã§ããå¿ èŠããããŸãã
次ã®ã³ãŒãã¯ç¢ºãã«ç解ããããã§ãïŒ
n := bits.LeadingZeros64(x)
Ones64ïŒxïŒã®æ確ãã«ã€ããŠã¯ãŸã å°ãçåããããŸãããLeadingZerosããã³TrailingZerosãšäžèŽããŠããŸãã ã ããç§ã¯èªåã®äž»åŒµãäŒãŸããçŸåšã®ææ¡ãæ¯æããŸãã å®éšãšããŠããã¹ãã±ãŒã¹ãå«ãããã±ãŒãžã®å®éšçãªçŽç²ãªGoå®è£ ã«æ¢åã®ã³ãŒãã䜿çšããŸããã
ãªããžããªïŒ https ïŒ
ããã¥ã¡ã³ãïŒ https ïŒ
ã¹ã¯ããé¢æ°ã®ã»ããããããããããŸãã[...] SwapBytesã®ã»ãšãã©ã®äœ¿çšã¯ãããã¹ãã§ã¯ãªããšãã«ãšã³ãã£ã¢ã³ãèªèããã³ãŒãã«ãããã®ã§ãã ã³ã¡ã³ãïŒ
ãã®ããã SwapBytes
APIããé€å€ããããšæããŸãã binary/encoding.BigEndian
ãããåçŽã§ããïŒãŸãã¯é«éã§ãããšæ³å®ãããïŒããã人ã
ã移æ€æ§ã®ãªãæ¹æ³ã§ããã䜿ãå§ããã®ã§ã¯ãªãããšå¿é
ããŠããŸãã
ãã®ãããSwapBytesãAPIããé€å€ããããšæããŸãã binary / encoding.BigEndianãããåçŽã§ããïŒãŸãã¯é«éã§ãããšæ³å®ãããïŒããã人ã ã移æ€æ§ã®ãªãæ¹æ³ã§ããã䜿ãå§ããã®ã§ã¯ãªãããšå¿é ããŠããŸãã
@mundaymãããã®ã«ãŒãã³ã¯ãããŸã§ã«å
åšåãããäºå®ã§ããïŒ SwapBytes64
ãBSWAP
ãšããŠçŽæ¥ã³ã³ãã€ã«ããããšãäžé©åã«äœ¿çšãã人ãããå€ããªãå¯èœæ§ããããŸããimoã
ãã€ããª/ãšã³ã³ãŒãã£ã³ã°ãããåçŽã§ããïŒãŸãã¯é«éã§ãããšæ³å®ãããïŒããã人ã ã移æ€æ§ã®ãªãæ¹æ³ã§ããã䜿ãå§ããã®ã§ã¯ãªãããšå¿é ããŠããŸããBigEndian
ReverseBytes
䜿çšã¯ããã·ã³ãããŒã¿ãã¡ã¢ãªã«é
眮ããæ¹æ³ã§äœã¬ãã«ã®ããŒã¿ã«ã¢ã¯ã»ã¹ããunsafe
ãšçµã¿åãããŠäœ¿çšââããå Žåã«ã®ã¿ã移æ€æ§ããªããšæããŸãã ãã ãã encoding.{Little,Big}Endian.X
ããã®ããã«äœ¿çšãããšã移æ€æ§ããªããªããŸãã ReverseBytes
ãå§çž®ã§äœ¿çšãããã®ã楜ãã¿ã«ããŠããŸãããå«ãŸããŠããªãã£ããæ²ããã§ãã
@ericlagergren
ãããã®ã«ãŒãã³ã¯ãããŸã§ã«å åšåãããã®ã§ããããïŒ
ã¯ãããã€ãå転ãå®è¡ããencoding/binary
ã®é¢æ°ã¯ãã³ã³ãã€ã©ãŒã«ãã£ãŠèªèãããæŽåãããŠããªãããŒã¿ããµããŒããããã©ãããã©ãŒã ã§åäžã®åœä»€ïŒ BSWAP
ïŒã«æé©åãããŠããïŒãŸãã¯æé©åã§ããïŒã³ãŒããã¿ãŒã³ã䜿çšããŸãã¢ã¯ã»ã¹ïŒäŸïŒ386ãamd64ãs390xãppc64leãªã©ïŒã
SwapBytes64ãBSWAPãšããŠçŽæ¥ã³ã³ãã€ã«ããããšãäžé©åã«äœ¿çšããŠãã人ã ãããéèŠã«ãªãå¯èœæ§ããããŸãã
ç§ã¯å察ããåŸåããããŸãã ãšã³ãã£ã¢ã³ãèªèããªãã³ãŒãã§ã¯SwapBytes
ãåæ³çã«äœ¿çšãããŠããå¯èœæ§ããããŸãããæ£ãã䜿çšããããããé »ç¹ã«èª€çšããããšæãããŸãã
runtime / internal / sysã¯ãåŸç¶ãŒããšãã€ãã¹ã¯ããã®Goãã¢ã»ã³ããªãããã³ã³ã³ãã€ã©çµã¿èŸŒã¿ããŒãžã§ã³ããã§ã«æé©åããŠããããããããã®å®è£ ãåå©çšã§ããããšã«æ³šæããŠãã ããã
@dsnetèå³æ·±ãããšã«ãäœãå ·äœçãªããšãèããŠããŸããïŒ
@aclementsãã€ãã¹ã¯ããçµã¿èŸŒã¿é¢æ°ãã©ã³ã¿ã€ã ã®ã©ãã§äœ¿çšãããŠãããç¥ã£ãŠããŸããïŒ ãã¹ã以å€ã®çšéã¯èŠã€ãããŸããã§ããã
@ mundaym ãAFAIKã©ã³ã¿ã€ã ã§ã¯äœ¿çšãããŸããã å éšAPIã«ããã»ã©æ³šæãæãå¿ èŠã¯ãªãã®ã§ãç°¡åã ã£ãã®ã§ãctzãè¿œå ãããšãã«è¿œå ããã ãã ãšæããŸãã ïŒïŒïŒãããã«ãŠã³ãã¯ããè¯ãéžæã ã£ãã§ããããïŒ
ãã¹ãŠïŒä»ã®ãšããAPIã«éäžããŠãã ããã CLã§ã®å®è£ ã¯ããããã®é¢æ°ãå®éã«äœ¿çšããŠãã¹ãã§ããããã«ãããåçŽã§é ãå®è£ ã§ãã APIã«æºè¶³ããããå®è£ ã調æŽã§ããŸãã
æ³šïŒ uint32
ãŸãã¯uint64
ãšåããµã€ãºã§ããããšãä¿èšŒãããŠããªããããããããuintptr
ããŒãžã§ã³ãå«ããå¿
èŠããããŸãã ïŒuintã¯åžžã«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ãæã
ã¢ãŒããã¯ãã£ãã¥ãŒãã©ã«æŽæ°ã§ã¯ãªãããã€ã³ã¿çšã
ãã ãã1ã€ã®è§£æ±ºçã¯ãAPIã«åãšã€ãªã¢ã¹ãå°å
¥ããããšã§ãïŒãããããã
ãã©ã³ãã¿ã€ãã§ããå¿
èŠããããŸããããã¯è°è«ã®äœå°ããããŸãïŒã
ã¿ã€ãWord = uint32 //ãŸãã¯64ãããã¢ãŒããã¯ãã£ã§ã¯uint64
//ããããWordã®ãããªããã€ãã®çæ³çãªå®æ°ãæäŸããå¿
èŠããããŸã
ãããæ°ããã¹ã¯ãªã©ã
次ã«ãWordãååŸããããã«ãåæ¥é èŸã®ãªãé¢æ°ãå°å ¥ããŸãã
å®éãmath / bitã2ã€ã®çµæãæäŸããå Žåãaddãsubãmulã
div; math / bigã¯ãã¢ãŒããã¯ãã£åºæã®ã¢ã»ã³ããªãªãã§æžãçŽãããšãã§ããŸãã
math / big exports type Word uintptr
ã ããã¯ééãã ã£ããããããªããšç§ã¯åæããŸãããäºææ§ã«ã¯ãããæ®ã£ãŠããããšãå¿
èŠã ãšæããŸãã ãããã£ãŠãmath / bitsã䜿çšããŠmath / bigãå®è£
ããå Žåã¯ãuintptrAPIãå¿
èŠã§ãã
å°ã話é¡ããå€ããŠããŸããããã€ãã£ãã®ç¬Šå·ãªãã¯ãŒããµã€ãºã¯åãªãç¡æå³ã§ã¯ãããŸãããïŒ ãã®å Žåãuintã®æ¥å°ŸèŸããªãã®ã¯ã»ãŒæ£ããããã§ãã
åäžã®ã¿ã€ãã§ããWordãã¢ãŒããã¯ãã£ãŒããšã«ç°ãªãããšã¯æãŸãããããŸããã ããã¯ãåŒã³åºãå ãšããã¥ã¡ã³ãã«å€ãã®è€éããããããããã§ãã æ¢åã®ã¿ã€ãã«åºå·ããããšã¯ãããªãããããåã«äœ¿ãããšãã§ããããšãæå³ããŸãã ã¢ãŒããã¯ãã£éã§åãç°ãªããšããããšã¯ããã®åãäžå¿ã«ãã¹ãŠã®ã³ãŒããèšèšãããããã«ãã¿ã°ã§ä¿è·ããããã¡ã€ã«ã«å€æ°ã®ã¢ããã¿ãå«ããããšãæå³ããŸãã
FWIWãmath / bigã®å®è£ ã§ã¯ãuint32 / 64ããŒã¹ã®ãããAPIãåŒãç¶ã䜿çšã§ããŸãïŒé¢æ°ã®uintptrããŒãžã§ã³ããªãå ŽåïŒã
@minuxç§ã¯2ã€ã®çµæã®addãsubãmulãdivã«å察ããŠããŸãããã2çªç®ã®ã¹ãããã§ãããå®è¡ããŸãããã ãã ããé©åãªããã©ãŒãã³ã¹ãå¿ èŠãªå Žåã¯ãã¢ã»ã³ããªã³ãŒããå¿ èŠã§ãã ããããç§ã¯ã³ã³ãã€ã©ãŒã«ãã£ãŠä»ã®æ¹æ³ã§çŽåŸã§ããŠããããã§ã...
uintããŒãžã§ã³ãšuintptrããŒãžã§ã³ãAPIã«è¿œå ããŸããã CLãèŠãŠã³ã¡ã³ãããŠãã ããã ããããæ©èœã®æ¥å¢ã«ã¯ããŸãæºè¶³ããŠããŸããã
@josharianãã€ãã£ãuintã¯ã64ããããã·ã³ã§ã32ãããå€ã«ãªãå ŽåããããŸãã ä¿èšŒã¯ãããŸããã uintptrã¯ãã·ã³ã®ã¯ãŒããµã€ãºãä¿èšŒããªãããšãç§ã¯ç解ããŠããŸãã ãããåœæãæ¯ãè¿ã£ãŠã¿ããšééã£ãŠãããšããŠããããã¯ããè³¢æãªéžæã®ããã«æãããŸããã ãããããæ¬åœã«Wordã¿ã€ããå¿ èŠã§ãã
uintptré¢æ°ã®å¯äžã®æ£åœãªå¿ èŠæ§ãmath / bigããµããŒãããããšã§ããå Žåãããããmath / bitsã®å®è£ ã¯å éšããã±ãŒãžã«å ¥ããããšãã§ããŸããmath/ bigã§uintptrã®ãã®ã ãã䜿çšããæ®ããå ¬éããŸãã
@ jimmyfrasche ã @ griesemerããã¯
uintãééã£ãŠããŸãã amd64p32ã§ã¯32ãããã§ãã
å®éãmath / bigã¯uintptrã®ä»£ããã«uintã䜿çšã§ãããããããŸããããGo1ã§ã¯
int / uintã¯åžžã«32ãããã§ãããããuintptrãå¯äžã®å¯èœãªè§£æ±ºçã«ãªããŸãã
math /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ãããã§ãã£ããããmath / bigã§ã¯uintã䜿çšããŸããã§ãããããã以éã¯ä¿®æ£ãããŠããŸãã math / bigã¯ããèªäœãäžè²«ããäžçã§ãããç¬èªã®ã¿ã€ãbig.Wordãæã€ããšã¯çã«ããªã£ãŠããŸããããã®ããã±ãŒãžã¯ãéžæããŠéžæãããŠãŒãã£ãªãã£ã«ãŒãã³ã®ã³ã¬ã¯ã·ã§ã³ã§ãã ãã®ã³ã³ããã¹ãã§æ°ããã¿ã€ããå®çŸ©ããããšã¯ãããã»ã©èª¬åŸåããããŸããã
int / uintããªã¢ã³ããå¿ èŠãã©ããã¯ãŸã£ããããããŸããã ããããäžè¬çã«å¿ èŠãªå Žåã¯ããã®ããã±ãŒãžã§ããããå®çŸ©ããæ¹ãããã¹ãŠã®åŒã³åºãå ã«ifã¹ããŒãã¡ã³ãã®èšè¿°ã匷å¶ãããããçã«ããªã£ãŠããŸãã ããããããããäžè¬çã«å¿ èŠã«ãªããã©ããã¯ããããŸããã
math / bigãšã®æœåšçãªäžäžèŽã«å¯ŸåŠããããã«ãããã®APIã§uintptrã«èšåããããšãå«ãŸãªããœãªã¥ãŒã·ã§ã³ãå°ãªããšã2ã€ãããŸãã
math / bigã§ãã¡ã€ã«word32.goãšword64.goãããã«ãã¿ã°ãšuintptrã䜿çšããŠå®çŸ©ããŸããé©åã«ãªãã€ã¬ã¯ãããã©ãããŒãåãå ¥ããŸãïŒã³ã³ãã€ã©ã®ã€ã³ã©ã€ã³åãæ£ããããšã確èªããŸãïŒã
big.Wordã®å®çŸ©ãuintã«å€æŽããŸãã æ£ç¢ºãªå®çŸ©ã¯ãAPIã§å ¬éãããŠããå Žåã§ããå éšå®è£ ã®è©³çŽ°ã§ãã ãããå€æŽããŠããamd64p32ãé€ããŠã³ãŒããå£ãããšã¯ã§ãããããã§ãmath / big以å€ã§åé¡ã«ãªãå¯èœæ§ã¯éåžžã«äœãããã§ãã
@rsc ïŒã64ãããã·ã¹ãã ã§ã¯32ãããã ã£ãã®ã§math / bigã§ã¯uintã䜿çšããŸããã§ãããããããä¿®æ£ããŸãããããããããã§ããuintptrãéžæããçç±ãå®å šã«å¿ããŸããã Go uint / intåã®èŠç¹ã¯ããã·ã³ã®èªç¶ãªã¬ãžã¹ã¿ãµã€ãºãåæ ããæŽæ°åãæã€ããšã§ããã big.Wordãuintã«å€æŽããŠãäœãèµ·ãããèŠãŠã¿ãŸãããã
ãã¹ãŠïŒ https ïŒ//go-review.googlesource.com/#/c/36315/ãæŽæ°ããŠãäžèšã®èª¬æã«åŸã£ãŠuintptré¢æ°ã®ããŒãžã§ã³ãé€å€ããŸããã
math / bigãæ«å®çã«æŽæ°ããŠãmath / bitsã䜿çšããŠå¹æã確èªããŸããïŒ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ïŒã§ãã
ã³ã¡ã³ãïŒ
ç§ã¯Oneãšããååã®ãã¡ã³ã§ã¯ãããŸããããLeading / TrailingZerosãšäžèŽããŠããŸãã 人å£ã¯ã©ãã§ããïŒ
ãªãäŒçµ±çãªPopcount
ãªãã®ã§ããïŒ
ãããã¯ããããåäœã®xã®é·ãã§ããLené¢æ°ã䜿çšããããšãã§ããŸãã ã€ãŸãã `LogïŒxïŒ== LenïŒxïŒ-1ïŒã§ãã
Len
ãŸãã¯Length
ã¯ãè¯ãååãšè¯ãã¢ã€ãã¢ã®ããã«èãããŸãã
1.1ã
ç§ã¯Oneãšããååã®ãã¡ã³ã§ã¯ãããŸããããLeading /ãšäžèŽããŠããŸã
TrailingZerosã 人å£ã¯ã©ãã§ããïŒ
ãããæ°ïŒ
@aclementsäœãæ°ããŸããïŒ
人å£ã¯æŽå²çãªçç±ããããè¯ãååãããããŸããããããªãããã®çšèªã«ç²ŸéããŠããããåãåé¡ãæ±ããŠããã®ã§ããã°ãå®éã«ã¯1ã€ä»¥äžãšã¯èšããŸããã
ããã±ãŒãžå ã§ãã£ãŠããããã¯ããå調ã§ãããCountOnesãæ確ã§æçœãªååãä»ããŠããã®ãããããŸããã
@aclementsäœãæ°ããŸããïŒ
ããããããšåŒã°ããããã±ãŒãžã§ã¯ãèšå®ãããããã以å€ã«äœãæ°ããããšãã§ãããããããŸããããCountOnesãåé¡ãªããæããã«ããæ確ã§ãã ãOnesããè¿œå ãããšã LeadingZeros
/ TrailingZeros
ã®ãZerosãã«ã察å¿ããŸãã
ãããæãæçœãªè§£éã§ããããããŸãããæ®ã£ãŠããŸãã æªèšå®ããããŸãã¯åèšããããã«ãŠã³ãããŠããå¯èœæ§ããããŸãïŒæåŸã®è§£éã¯éåžžã«ããããã«ãããŸããããé¢é£ããæŠå¿µã«ç²ŸéããŠãããããµãã£ãã¯ã¹ã®ãªãã«ãŠã³ãã¯unsafe.SizeOfã®ããã«æããããããã䜿çšããŠã³ãŒããèªã¿åã人ã«ãšã£ãŠã¯æœåšçãªãã©ããã§ãïŒ
Trailing / LeadingZeroesããã©ãŒãªã³ã°ããAllOnesãTotalOnesã®ãããªãã®ãããããŸããããããããšã¯ç°ãªããäœçœ®ãèæ ®ãããªãããã«æå®ããŸãã
AllOnesã¯ããã¹ãŠã®ãã®ãè¿ãããã«èãããŸãïŒããããã¹ã¯ã§ïŒïŒããŸãã¯ãã¹ãŠ1ã§ããåèªãããããŸããã
CountOnesãšTotalOnesã¯ã»ãŒåãããã«èŠããŸããããã®æäœã§æãäžè¬çã«ç¥ãããŠããååã¯ãpopulation countãã§ãããããCountOnesã®æ¹ãæãŸãããšæãããŸãã
ããã€ãã®å€æŽãå ããæ°ããããŒãžã§ã³ïŒhttps://go-review.googlesource.com/#/c/36315/ïŒãã¢ããããŒãããŸããã
1ïŒ Ones
ååãPopCount
ïŒã»ãšãã©ã®äººã¯ãäžè²«æ§ã®ããããããããå調ãªååOnes
ããŸãè奮ããŠããŸããPopCount
ãäœãããã®ããæ£ç¢ºã«ç¥ã£ãŠããã§ããããããã¯ããã®é¢æ°ãäžè¬çã«ç¥ãããŠããååã§ãã ä»ã®éšåãšã¯å°ãççŸããŠããŸããããã®æå³ã¯éåžžã«æ確ã«ãªã£ãŠããŸãã ããã«ã€ããŠã¯ã©ã«ãã»ã¯ã«ãã»ãšããŒãœã³ãšäžç·ã«è¡ããŸãïŒãæããªäžè²«æ§ã¯å°ããªå¿ã®ãããŽããªã³ã§ã...ãïŒã
2ïŒç§ã¯ååãå€æŽLog
ããLen
ã®ããã«bits.Len
ã æ°å€xã®ãããé·ã¯ãxã2é²è¡šçŸã§è¡šãã®ã«å¿
èŠãªãããæ°ã§ãïŒhttps://en.wikipedia.org/wiki/Bit-lengthïŒã ãµããããããã§ãããã§Log
ããå¿
èŠããªããªããŸããããã¯ããã¡ãã£ãšé¢åãªãå質ã§ã¯ãããŸããã Log
å®çŸ©æ¹æ³ãèãããšã Len(x) == Log(x) + 1
ãããã®ã§ããããåå©ã ãšæããŸãã ããã«ãçµæãåžžã«> = 0ã«ãªããšããå©ç¹ããããïŒäºçŽ°ãªïŒå®è£
ã§+/- 1ã®ä¿®æ£ãããã€ãåé€ãããŸãã
å šäœãšããŠããã®æç¹ã§ãã®APIã«ã¯ããªãæºè¶³ããŠããŸãïŒåŸã§é¢æ°ãè¿œå ãããå ŽåããããŸãïŒã ç§ãã¡ãçå£ã«æ€èšããããšæããããããªãä»ã®å¯äžã®ããšã¯ããã¹ãŠã®çµæã«çœ²åãä»ããã¹ããã©ããã§ãã åã«ææããããã«ããã¬ãŒãªã³ã°/ãªãŒãã£ã³ã°ãŒãé¢æ°ã®çµæã¯ã笊å·ãªãã§ãªããã°ãªããªãã·ããæŒç®ãžã®å ¥åã«ãªãåŸåããããŸãã ããã¯ãééããªã笊å·ãªãã®å€ãè¿ãå¯èœæ§ãããLenãšPopCountã ããæ®ããŸãã
ã³ã¡ã³ãïŒ
math / bigã§ã®ç§ã®çµéšã¯ãã·ããããŠããªããšãã«é¢æ°ã«ãã£ãŠuintã¢ãŒãã«åŒ·å¶ãããããšã«äžæºãæããŠããŸããã math / big / prime.goã§ãç§ã¯æžãã
for i := int(s.bitLen()); i >= 0; i-- {
s.bitLenïŒïŒãintãuintã§ã¯ãªãè¿ãå Žåã§ããç§ã¯èŠãã«ç¢ºä¿¡ãæãŠããå°æ¥ã®CLãuintãè¿ãããã«å€æŽããªãå¯èœæ§ãããããšã確信ããŠããªãã£ããããforã«ãŒããç¡éã«ãŒãã«ãªããŸããã ãã®é²åŸ¡çã§ããå¿ èŠãããããšã¯ãåé¡ãããããšã瀺åããŠããŸãã
Uintã¯ãintããããšã©ãŒãçºçãããããããã»ãšãã©ã®APIã§Uintãæšå¥šããŠããŸããã ãšã«ããã»ãšãã©ã®ã·ããåŒã§å¿ èŠãªããã«ãæ°åŠ/ãããã®ãã¹ãŠã®é¢æ°ãintãè¿ããuintãžã®å€æãã·ããåŒã§å®è¡ããããã«ããæ¹ãã¯ããã«è¯ããšæããŸãã
ïŒç§ã¯å€æŽãææ¡ããŠããŸããããuintãå¿ èŠãšããã·ããã¯æ¯ãè¿ã£ãŠã¿ããšééãã ã£ããšæããŸãããã€ãä¿®æ£ã§ãããããããŸãããä»ã®APIãå·ã€ããªããã°ããã®ã§ãããïŒ
æ«å°Ÿã®ãŒããšpopcounté¢æ°ã®åŒã³åºãã®ããã«ã³ãŒããgrepããåŸãintãè¿ãããšããµããŒãããŠããŸãã åŒã³åºãã®å€§éšåã¯ãçãå€æ°å®£èšãšintåã®æ¯èŒã§ãã ã·ããã§ã®åŒã³åºãã«ã¯ãã¡ããuintåãå¿ èŠã§ãããé©ãã»ã©ãŸãã§ãã
ãã€ããŒãªèª¿æŽãã¢ããããŒãããŸããã +1ãšã³ã¡ã³ãããšã«ãã«ãŠã³ãã®çµæãint
ãšããŠæ®ããŸãããã
https://go-review.googlesource.com/36315
RotateLeft/Right
ã®å
¥åã«ãŠã³ããuint
ããããªããšãå€ãè² ã®å Žåã«äœãèµ·ããããæå®ããããèš±å¯ããªãããã«ããå¿
èŠããããŸãã
æåŸã«ãç§ãã¡ãé¢ãå»ããããããªãLen
以æ¥ããã¹ãŠã®åŸã«LenN(x) == N - LeadingZerosN(x)
ã æèŠã¯ïŒ
ãã®æç¹ã§éèŠãªãã£ãŒãããã¯ããªããªã£ãå Žåã¯ããã®APIã䜿çšããŠãã¬ãã¥ãŒåŸã«æåã®å®è£ ãã³ãããããããšããå§ãããŸãã ãã®åŸãå®è£ ã®èª¿æŽãéå§ã§ããŸãã
次ã®ã¹ãããã§ã¯ãä»ã«ã©ã®é¢æ°ãå«ããããå
·äœçã«ã¯2ã€ã®åŒæ°ã䜿çšããŠãã£ãªãŒããçµæãçæããŠãã£ãªãŒããAdd
/ Sub
/ãªã©ã«ã€ããŠèª¬æããŸãã ã
@griã¯10Len
é¢æ°ã«ã€ããŠèããŠããŸããïŒ ((N - clz(x) + 1) * 1233) >> 12
ããŒã¹2ãããããããããããŒãã§ã¯ãããŸããããããã§ã䟿å©ã§ãã
17:03ãããŒãã»ã°ãªãŒãºããŒã§éã2017幎2æ10æ¥ã«ã¯[email protected]
æžããŸããïŒ
ãã€ããŒãªèª¿æŽãã¢ããããŒãããŸããã +1ãšã³ã¡ã³ãããšã«ã®çµæãæ®ããŸããã
intãšããŠã«ãŠã³ããããŸããhttps://go-review.googlesource.com/36315
RotateLeft / Rightã®å ¥åã«ãŠã³ããuintã®ãŸãŸã«ããŸããããã以å€ã®å Žåã¯ã
å€ãè² ã®å Žåã«äœãèµ·ããããæå®ãããããããèš±å¯ããªãå¿ èŠããããŸããæåŸã«ãLenNïŒxïŒ== N-ãªã®ã§ãçµå±Lenãé€å€ããããšãã§ããŸãã
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)
20:16æéã2017幎2æ10æ¥ã«ã¯ããšãªãã¯Lagergren [email protected]
æžããŸããïŒ
ãŸãã ãã®åé¡ã®ç¯å²å€ã«ãªã£ãŠããå Žåã¯ã容赊ãã ããã
ãã§ãã¯ãããç®è¡ã®æ¯æã äŸïŒAddNïŒxãy TïŒïŒsum Tãoverflow boolïŒçœ²åããããªãŒããŒãããŒã«ã€ããŠè©±ããŠããã®ã§ããïŒ ãŸãã¯ç¬Šå·ãªããªãŒããŒãããŒïŒãã£ãªãŒ/ãããŒïŒïŒ
ãŸããåçŽåããããã«ããªãŒããŒãããŒ/ãã£ãªãŒ/ãããŒãã¿ã€ãTãšããŠè¿ãããšã奜ã¿ãŸã
å€åé·æŒç®ã
@ericlagergren ïŒåºæ°2ïŒ Len
é¢æ°ã¯ãã»ãŒlog2ã§ãããæ¬è³ªçã«ã¯ãããã«ãŠã³ãé¢æ°ã§ãã åºæ°10ã®Len
é¢æ°ã¯ãå®éã«ã¯å¯Ÿæ°é¢æ°ã§ãã ãããæçšã§ããããšã¯åŠå®ã§ããŸãããããã®ããã±ãŒãžã«ã¯ããŸãé©åã§ã¯ãªãããã§ãã
ã¯ãã checked
æŒç®ãåãå
¥ãããšãããšæããŸããæåã«çŸåšã®APIãéããŠãååŸã«ç§»åããã®ã§ã¯ãªããé²æ©ã§ããããã«ãããã£ãã ãã§ãã ãããŸã§ã«ã³ã¡ã³ãããã»ãšãã©ã®äººã¯ããã«æºè¶³ããŠããããã§ãã
AddãSubé¢æ°ã«é¢ããŠïŒãã£ãªãŒã¯åŒæ°ãšåãåã§ãªããã°ãªããªããšãã@minuxã«åæããŸãã ãŸãããããã®é¢æ°ã«ã¯uintåŒæ°ä»¥å€ã«äœããå¿ èŠã ãšã¯æããŸãããèŠç¹ã¯ãïŒã»ãšãã©ã®å ŽåïŒuintã«ã¯ãã©ãããã©ãŒã ã®èªç¶ãªã¬ãžã¹ã¿ãµã€ãºããããããããããã®æäœãæãçã«ããªã£ãŠããã¬ãã«ã§ãããšããããšã§ãã
æ°åŠ/ãã§ãã¯ãããããã±ãŒãžã¯ãããã®ããã®ããè¯ã家ã§ãããããããŸããã checked.Add
ã¯bits.Add
ãããæ確ã§ãã
@minux笊å·ä»ããã§ãã¯æŒç®ãèããŠããã®ã§ããªãŒããŒãããŒããŸããã
@griesemer reïŒããŒã¹10 Len
ïŒçã«ããªã£ãŠããŸãïŒ
å¿ èŠã«å¿ããŠããã§ãã¯æŒç®çšã®CLãéä¿¡ã§ããŸãã @jimmyfrascheãå¥ã®ããã±ãŒãžåã§äœæãããšããã¢ã€ãã¢ã
Add / sub / mulã¯bits
ã«å±ããå Žåãšå±ããªãå ŽåããããŸããããããã®æäœã®çšéã¯ãã§ãã¯ãããæ°åŠã ãã§ã¯ãããŸããã ããäžè¬çã«ã¯ããããã¯ãã¯ã€ãããªç®è¡æŒç®ã§ãããšèšããŸãã add / subã®å Žåã1ãããã®ãã£ãªãŒ/ãªãŒããŒãããŒã®çµæãšãªãŒããŒãããŒã®ããŒã«ã€ã³ãžã±ãŒã¿ãŒã®éã«ã»ãšãã©éãã¯ãããŸãããããããããã§ãŒã³å¯èœã«ããããã«ãadd-with-carryãšsubtract-with-borrowãæäŸããå¿
èŠããããŸãã ãŸããã¯ã€ãmulã®å ŽåããªãŒããŒãããŒãããè¿œå ã®çµæã«ã¯ããã«å€ãã®æ
å ±ããããŸãã
ãã§ãã¯ããã/ã¯ã€ããªç®è¡æŒç®ãèŠããŠããããšããå§ãããŸãããã©ãŠã³ã2ã®ããã«ããããæ®ããŠãããŸãããã
ããã®ããã±ãŒãžã䜿çšãããã¹ãŠã®äººã¯ãPopCountãäœãããããæ£ç¢ºã«ç¥ã£ãŠããŸãã
ç§ã¯ä»¥åã«ãã®æ©èœã䜿çšããããšããããã©ããããããPopCountåã«æ £ããŠããŸããã§ããïŒãã ãããpopãã䜿çšããHacker's Delightããå®è£ ããã³ããããšç¢ºä¿¡ããŠããããã䜿çšããå¿ èŠããããŸãïŒã
ç§ã¯ããŒãã£ãŒã«åå ããŠããããšã¯ç¥ã£ãŠããŸããããOnesCountãã¯ç§ã«ã¯ããªãæçœã«æããŸããããã¥ã¡ã³ãã®ã³ã¡ã³ãã«ãPopCountããšããåèªãèšèŒãããŠããã°ããããæ¢ããŠãã人ã¯ãšã«ãããããèŠã€ããã§ãããã
ãã§ãã¯/ã¯ã€ãæŒç®ã«é¢é£ïŒïŒ6815ã ããããã¯ãã1ã€ãåããŸãããïŒ
@griesemerã¯æžããïŒ
ïŒåºæ°2ïŒLené¢æ°ã¯ãã»ãŒlog2ã§ãããæ¬è³ªçã«ã¯ãããã«ãŠã³ãé¢æ°ã§ãã 10é²æ°ã®Lené¢æ°ã¯ãå®éã«ã¯å¯Ÿæ°é¢æ°ã§ãã ãããæçšã§ããããšã¯åŠå®ã§ããŸãããããã®ããã±ãŒãžã«ã¯ããŸãé©åã§ã¯ãªãããã§ãã
æšå¹Ž10æã«ã10é²æ°ã®é·ããã®åé¡ã«å¯Ÿããããã€ãã®ã¢ãããŒããæ¯èŒããããã®ãã³ãããŒã¯ãäœæããŸãããããããã
ææ¡ãšããŠåãå ¥ããããŸããã ããããåé²ããããã®ãã€ããŒãªèª¿æŽãããã§ãããããããŠããã¯åé¡ãããŸããã
@rogpeppe ïŒ PopCount
ãOnesCount
ãŸãããããã¯ã4ã€ã®èŠªæãç«ãŠãããã§ãïŒ PopCount
ã䜿çšãããšããç§ã®ææ¡ã®ããã«ïŒã ããã¥ã¡ã³ãæååã§ã人å£æ°ããšåŒã°ããŸãã
@rscããšã«ããã§ãã¯æžã¿/ã¯ã€ãç®è¡æŒç®ã¯ä»ã®ãšããé€å€ããŸãã
ãŸãã @ rscããšã«ããã¹ãŠã®ã«ãŠã³ãé¢æ°ã¯int
å€ãè¿ããŸãã䜿ããããããããã«ïŒãããŠïŒ19113ã«æ³šç®ããŠïŒãããŒããŒã·ã§ã³ã«ãŠã³ãã«int
å€ã䜿çšããŸãã
åã«N - LeadingZerosN
ã§ããã«ããããããã LenN
é¢æ°ãæ®ããŸããã ãããã RotateLeft
/ Right
ãåæ§ã®å¯Ÿç§°æ§ããããäž¡æ¹ããããŸãã
TrailingZeroes
ãããã«é«éãªå®è£
ãè¿œå ãããã¹ããå®äºããŸããã
ãã®æç¹ã§ã䜿çšå¯èœãªæåã®å®è£ ããããšæããŸãã https://go-review.googlesource.com/36315ã®ã³ãŒããç¹ã«APIã確èªããŠãã ããã ç§ãã¡å šå¡ãæºè¶³ããŠãããªãããããæåºããŠãããããã§ãã
次ã®ã¹ãããïŒ
æ°ããããã±ãŒãžãèšèšããŠããŸã
@minuxããªãã¯æ°ããæ°åŠ/ããã°ãæå³ããŸããïŒ ã©ããã§ããã»ã¹ããã©ãããšã¯å¯èœã§ããïŒ
@TuomLarsen ïŒ @minuxã¯ãæ°ããããã±ãŒãžãã§æ°åŠ/ããããåç §ããŸããã 圌ã¯ãæ°åŠ/ãããã䜿çšãããå ŽåãšããŠãæ°åŠ/ããã°ã«ã€ããŠèšåããŸããã ïŒå°æ¥çã«ã¯ãã³ã¡ã³ããããå ·äœçã«ããŠãã ãããããããã°ãåç §ããŠããå 容ãæ€çŽ¢ããŠæšæž¬ããå¿ èŠããªããªããŸããããããšãããããŸãïŒã
CL https://golang.org/cl/37140ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
Go 1.9ã®æ°åŠ/ãããã§ã³ã³ãã€ã©æ¯æŽã®çµã¿èŸŒã¿åãçºçããŸããïŒ
@cespareå°éãããã©ããã«ãã£ãŠç°ãªããŸãïŒ@khrïŒïŒã ãããšã¯å¥ã«ããã©ãããã©ãŒã ã«äŸåããªãé©åãªå®è£ ãå¿ èŠã§ãã ïŒmath / bigãå®å šã«math / bitsã®äœ¿çšã«ç§»è¡ããããªãçç±ã®1ã€ã¯ãçŸåšãmath / bigã«ãã©ãããã©ãŒã åºæã®ã¢ã»ã³ããªããããããé«éã§ããããã§ããïŒ
ç§ã®ãã¬ãŒãã§ã¯ãå°ãªããšãã¢ãŒãã«ã€ããŠã¯ããã§ã«çµã¿èŸŒã¿é¢æ°ãå®è¡ããŠããŸã
ïŒ386ãamd64ãarmãarm64ãs390xãmipsãããããppc64ïŒã
2017幎2æ17æ¥éææ¥12:54 PMãRobert Griesemer < [email protected]
æžããŸããïŒ
@cespare https://github.com/cespareå°éãããã©ããã«ãã£ãŠç°ãªã
@khr https://github.com/khr ïŒïŒã ãããšã¯å¥ã«ã
é©åãªãã©ãããã©ãŒã ã«äŸåããªãå®è£ ã ïŒç§ãã¡ãããªãçç±ã®1ã€
æ°åŠ/ããã°ãå®å šã«æ°åŠ/ãããã®äœ¿çšã«ç§»è¡ãããã®ã¯ãçŸåšç§ãã¡ã
math / bigã«ãã©ãããã©ãŒã åºæã®ã¢ã»ã³ããªããããŸããããã¯ããé«éã§ããïŒâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/18616#issuecomment-280763679 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AGkgIIb8v1X5Cr-ljDgf8tQtT4Dg2MGiks5rdgkegaJpZM4Lg5zU
ã
x86-64ã§äººå£ã«ãŠã³ããå®è£ ããæéã®æ¹æ³ã«é¢ãããã®èšäºã¯åœ¹ç«ã€ãããããŸããïŒæäœæ¥ã§ã³ãŒãã£ã³ã°ãããã¢ã»ã³ããªã¯ãé床ãšåçŽãã«ãããŠçµã¿èŸŒã¿é¢æ°ãæã¡è² ãããŸã
CL https://golang.org/cl/38155ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/38166ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/38311ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/38320ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/38323ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
ããå°ãè°è«ïŒ
èªåïŒ
math / bits.RotateLeftã¯çŸåšãåŒæ°ããŒãæªæºã®å Žåã«ãããã¯ã«ãªãããã«å®çŸ©ãããŠããŸãã
åŒæ°ããŒãæªæºã®å Žåã«å³å転ãè¡ãããã«RotateLeftãå®çŸ©ããããã«å€æŽããããšæããŸãã
ãã®ãããªåºæ¬çãªã«ãŒãã³ãæã€ããšã¯ãäžå¿ èŠã«å³ããããã«æãããŸãã è² ã®éã®å転ã¯ããŒãé€ç®ïŒãããã¯ãèµ·ããïŒã§ã¯ãªããã¯ãŒããµã€ãºïŒãããã¯ãèµ·ãããªãïŒããã倧ããã·ããã«é¡äŒŒããŠãããšç§ã¯äž»åŒµããŸãã ãŒãé€ç®ã¯ã代ããã«è¿ãåççãªçµæããªããããå®éã«ã¯ãããã¯ã«é¥ãå¿ èŠããããŸãã è² ã®éã§å転ãããšãå®å šã«æ確ã«å®çŸ©ãããçµæãè¿ãããŸãã
RotateLeftãšRotateRightã¯ãããäžæ¹ãšäžç·ã«å®è£ ã§ããããã«ãªããŸããããå¥ã ã®é¢æ°ãšããŠä¿æããå¿ èŠããããšæããŸãã æšæºçãªäœ¿çšæ³ã¯ãéè² ã®åŒæ°ã䜿çšããŸãã
ããã§äœããããå Žåã¯ãããªãŒãºããå¿ èŠããããŸãã 1.9ããªãªãŒã¹ããããšãèããå€ããããšã¯ã§ããŸããã
ããïŒ
ãã®ãããªãã®ãæ¬åœã«å¿ èŠãªå Žåã¯ãå転ãšãã1ã€ã®é¢æ°ããããŸãããã®é¢æ°ã¯ãå·Šãæ£ãå³ãè² ã«ãªããŸãã
èªåïŒ
åé¡ã¯
ããã.RotateïŒxã-5ïŒ
ãã®ã³ãŒããèªãã ãšãã«ãæçµçã«å·Šã«å転ããã®ãå³ã«å転ããã®ãã¯æ確ã§ã¯ãããŸããã
bits.RotateRightïŒ5ïŒ
æ°åŠ/ãããã«2åã®Rotate *é¢æ°ãããããšãæå³ããå Žåã§ããã¯ããã«æ確ã§ãã
ãã€ã±ã«ã»ãžã§ãŒã³ãºïŒ
眲åãããå転ãšã¯ãã³ãŒãå ã§ãžã£ã³ãããããšãæå³ããŸããã æ®å¿µãªããã§ãã
èªåïŒ
ããããææ¡ãããã»ãã³ãã£ã¯ã¹ã䜿çšãããšãå®è£ ã¯å®éã«ã¯ç°¡åã«ãªããŸãã äžäœ6ãããïŒ64ãããå転ã®å ŽåïŒããã¹ã¯ãããšãæ£åžžã«æ©èœããŸãã
é¢æ°ã®æ°ãååã§ããããããã¯ãæ¡ä»¶åå²ããããªãã«ãã¹ãŠã®å Žåã«éåžžã«å¹ççã«å®è¡ã§ããããã笊å·ä»ãåŒæ°ã䜿çšããåäžã®Rotateã奜ã¿ãŸãã
ãšã«ããå転ã¯å°éçãªæ©èœãªã®ã§ãããã䜿çšãã人ã ã¯ãæ£ã®åŒæ°ãå·Šã«ã·ããããè² ã®åŒæ°ãå³ã«ã·ããããããšãèŠããŠããããã«æ±ããããããšã確å®ã«å¿«é©ã«ããŸãã
ãã€ã§ãå·®ãåå²ããŠã笊å·ä»ãåŒæ°ã§RotateLeft
ã®ã¿ãæäŸã§ããŸãã ããã«ãããæ¹åã«äŸ¿å©ãªããŒã¢ããã¯ãæäŸãããŸãããæ©èœã®éè€ã¯åé¿ãããŸãã
@bcmills @robpike https://github.com/golang/go/issues/18616#issuecomment -275598092ããå§ãŸããããã€ãã®ã³ã¡ã³ããç¶ãããã®æ£ç¢ºãªãããã¯ã«é¢ãã以åã®ãã£ã¹ã«ãã·ã§ã³ãåç §ããŠ
@josharianã³ã¡ã³ããèŠãããšããããŸãããããã§ãèªåã®ããŒãžã§ã³ã奜ã¿ãŸãã ããã¯æ°žé ã«èªè»¢è»ã«ä¹ãããšãã§ããŸãããç§ã¯å®è£ ãç°¡åã§ãå®çŸ©ãç°¡åã§ãç解ãç°¡åã§ãææžåãç°¡åã«ãªãããšããŠããŸãã 笊å·ä»ãåŒæ°ãæã€åäžã®Rotateé¢æ°ã¯ã笊å·ãå®çŸ©ããå¿ èŠãããããšãé€ããŠããã¹ãŠãæºãããšæããŸãããå·Šãæ£ã§ãããšããããšã¯ãrotateåœä»€ã䜿çšã§ãã人ãªã誰ã§ãçŽæçã«ç解ã§ããã¯ãã§ãã
ãããããã®å·Šãæ£ã§ãããšããããšã¯ãå転åœä»€ã䜿çšã§ãã人ãªã誰ã§ãçŽæçã«ç解ã§ããã¯ãã§ãã
ç§ã¯èªåãå転åœä»€ã䜿çšã§ãããšèããã®ã奜ãã§ãç§ã®çŽæã¯ãããããããªããããã©ã®æ¹åã§ããããèšããªãã®ã§ããïŒããããæ®ã£ãŠããŸããã確å®ã«ããã¥ã¡ã³ãå¿ èŠããããŸããã æ£ã®æ¹åãéžæããå Žåã¯å·Šå転ã«ãªãã®ã¯çŽæçã§ãããäœããæããã«æ£ããçãã«ãªãã«ã¯ã¯ããã«é«ããããå€ãããããããã¹ãŠã®é話ãµã€ãã§ãäœãèšããã«å転ããŠããæ¹åãæ確ã«ãªããŸããããã
èªã¿ãããã«é¢ããŠã¯ã time.Duration
APIã«æ²¿ã£ããã®ã¯ã©ãã§ããããã
const RotateRight = -1
bits.Rotate(x, 5 * RotateRight)
å€åãããã«ãã£ãŠå®çŸ©ãããå®æ°ãŸãã¯å€åèªè ã®ããã®ç·Žç¿ïŒåŒã³åºããµã€ãïŒïŒ
@aclementsãããã£ãŠãåŒæ°ã®ç¬Šå·ã ããç°ãªããåãæ©èœãæã€2ã€ã®ïŒNåã®ïŒé¢æ°ã«ãªããŸãã ä»ã§ã¯AddãšSubã§ããã蚱容ããŠããŸããããããç§ãèããããšãã§ããå¯äžã®äŸã§ãã
æ°å€è»žã§ã¯ãæ£ã®æ°ãå³ã«å¢å ãããããæ£ã®æ°ã®å Žåã笊å·ã§å®çŸ©ãããæ¹åã®å転/ã·ããã«ãã£ãŠããããå³ã«ç§»åãããšäºæ³ãããŸãã
ããã[ææžåããã]å察ã«ãªããã©ããã¯åé¡ãããŸããããç§ã¯ãããçŽæçãšã¯èšããŸããã
@cznicãããã¯å³ããå·Šã«æžãããŠããŸãã
ãŸããåæ¹åã§æ©èœãããå Žåã¯ã Rotate
ïŒhttps://github.com/golang/go/issues/18616#issuecomment-275016583ïŒã ããæ¯æããŸãã
æ¹åæ§ã«ã€ããŠ@aclementsã®æžå¿µã«åè«ãšããŠïŒæäŸRotateLeft
æš©å©ãå転ãããããšãã誀ã£ãå®å¿æãæäŸããããšãã§ããŸããåäœããããšïŒããã¯èšããã RotateLeft
ã®ã§ã確ãã«ãããå転ããŠããŸããå³ïŒ"ã ã€ãŸãã RotateLeft
ãšè¡šç€ºãããŠããå Žåã¯ãä»ã«äœãããŸããã
ãŸãã bits.Rotate
ã¯ãå®éã«ã¯ã¹ãã·ã£ãªã¹ãã³ãŒãã§ã®ã¿äœ¿çšãããŸãã ããã¯ãå€ãã®ããã°ã©ããŒã䜿çšããæ©èœã§ã¯ãããŸããã æ¬åœã«ãããå¿
èŠãšãããŠãŒã¶ãŒã¯ãå転ã®å¯Ÿç§°æ§ãç解ããã§ãããã
@nathany
ãããã¯å³ããå·Šã«æžãããŠããŸãã
ãããã¯åãªã2é²æ°ã§ãã åºæ°ã®æ¡æ°ã¯å·Šããå³ã«æžã蟌ãŸããŸãããã¹ãŠã§ã¯ãªãã«ããŠããã»ãšãã©ã®å³ããå·Šã®æžèšäœç³»ã§ãåæ§ã§ãã 123ã¯ãçŸäºåäžã§ã¯ãªããçŸäºåäžã§ãã
æ¡ã®è¢«ä¹æ°ã®çŽ¯ä¹ãå³ã«æžå°ããããšã¯å¥ã®ããšã§ãã
ç¹°ãè¿ãã«ãªããŸãããç§ã¯æ¹åæ§ãæ°ã«ããŸãããçŽæçãªæ¹åæ§ã¯å人çãªæ³ååã®åé¡ã§ãããšããã ãã§ãã
ç§ã¯å転ã奜ãã§ãã ç§ã®èŠè§£ã§ã¯ãæäžäœãããã¯çŽæçã«ååã§ãã
éçºè ã®åæ°ãèŠããŠããªãããšãããã®ã§ã¯ãªããRotateLeftãšRotateRightã®äž¡æ¹ãç¶æããŠãã ããã ãã ããè² ã®æ°ãåŠçããã®ã¯åé¡ãªãããã§ãã
éçºè ã®99ïŒ ã¯å転åœä»€ãããã°ã©ã ããããšã¯æ±ºããŠãªãã®ã§ãæ確ãªæ¹åã®å¿ èŠæ§ã¯ãããã匱ãã§ãã 1åã®åŒã³åºãã§ååã§ãã
ãã®è°è«ãåŒã³èµ·ãããåé¡ã¯ãäž¡æ¹ãæã€ã«ã¯ãè² ã®å€ãåé¡ãªããã©ãããããã§ãªãå Žåã¯ã©ããããã«ã€ããŠè°è«ããå¿ èŠããããšããããšã§ãã 1ã€ãããªãããšã§ããã®è°è«å šäœã倱ãããŸãã ãã£ãããšãããã¶ã€ã³ã§ãã
ã¯ãªãŒã³ãªãã¶ã€ã³ã«ã€ããŠã®è°è«ã«ã¯å€å°å
±æããŸããããããå®çŸããããã«ãåãå®è£
ãç¶æããªãããRotateRightããããRightããåé€ããªããã°ãªããªãã®ã¯å¥åŠã«æããŸãã å®éã«ã¯ã質åã«çããããã«èŠããå¯äžã®æ¹æ³ã¯ãååãæèµ·ãã質åã«ãã£ãŠããããèŠã人ã
ã«ããã¥ã¡ã³ããèªãŸãããšããããšã§ãã
çµå±ã®ãšãããããã¯æ確ãªæ¹åãšè² ã®å€ã®æ確ãªæ¯ãèãã®åé¡ã§ãã äžè¬çãªã±ãŒã¹ã§ã¯ãè² ã®å€ã¯ããããããã»ã©åé¡ã«ãªããªãã¯ãã§ãã
ç§ãèšã£ãŠããã®ã¯ãRotateã¯ãã¹ãŠã®äººã«1ã€ã®è³ªåãæèµ·ããããã¥ã¡ã³ããéããŠéæ¥çã«ããã«çããããšã§ãã
RotateRightã¯ãããã¥ã¡ã³ããæ°ã«ãããŠããå Žåã«ãããèªãããšãã§ããïŒãããŠèªãã¹ãã§ããïŒéåžžã«å°æ°ã®äººã
ã«1ã€ã®è³ªåãæèµ·ããŸãã
äžæ¹ãRotateã¯ããããã人ã
ãif n < 0 { RotateLeft(...) } else { RotateRight(...) }
æžãã®ã劚ããã§ãããã
@ golang / proposal-reviewã¯ããã«ã€ããŠè°è«ããçµå±1ã€ã®é¢æ°ããæããªãããšã«ãªããŸããããåŒã³åºããµã€ãã§ããã«æ確ã«ããããã«ã Rotate
ã ãã§ãªãRotateLeft
ãšããååãä»ããŸããã è² ã®æ°ã¯å³ã«å転ããããã¥ã¡ã³ãã§ãããæ確ã«ãªããŸãã
CL https://golang.org/cl/40394ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/41630ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
å ã®ææ¡ãšããã€ãã®è¿œå æ©èœã¯ããã®æç¹ã§èšèšããã³å®è£ ãããŠããŸãã æéã®çµéãšãšãã«ãã®ã©ã€ãã©ãªã«è¿œå ããå¯èœæ§ããããŸãããçŸæç¹ã§ã¯ããªããå®å šããªããã§ãã
æã泚ç®ãã¹ãã¯ã次ã®æ©èœã決å®ãŸãã¯å®è£ ããŠããªãããšã§ãã
å人çã«ã¯ããããããããããããã±ãŒãžã«å±ããŠãããšã¯ç¢ºä¿¡ããŠããŸããïŒãããããã¹ãã¯ããã§ãïŒã å€ç²ŸåºŠã®add / sub / mulãå®è£ ããé¢æ°ã䜿çšãããšãäžéšã®æ°åŠ/ããã°ã«ãŒãã«ã®çŽç²ãªGoå®è£ ãå¯èœã«ãªããŸãããç²åºŠãæ£ãããšã¯æããŸããããã¯ãã«ã§åäœããæé©åãããã«ãŒãã«ãšæ倧å€ãå¿ èŠã§ãããããã®ã«ãŒãã«ã®ããã©ãŒãã³ã¹ã add / sub / mulã®ãçµã¿èŸŒã¿é¢æ°ãã ãã«äŸåããGoã³ãŒãã§ãããéæã§ãããšã¯æããŸããã
ãããã£ãŠãä»ã®ãšããã倧ããªç°è°ããªãéãããã®åé¡ããå®äºããšããŠã¯ããŒãºããããšæããŸãã ãããéããããšã«ãæ¥é±ããããã§å£°ãäžããŠãã ããã
ç§ã¯ãããã®ç·ã«æ²¿ã£ãŠé¢æ°ãè¿œå ããããšã«è³æã§ãã
éåçãªæ©èœãããããåæ ããååãä»ãã以å€ã®çç±ããªãéãããããã¯ç¬èªã®ããã±ãŒãžã«å±ããŠãããšåŒ·ãä¿¡ããŠããŸãã
ïŒ+1ïŒãã®åé¡ãéãããšããšïŒheartïŒãããŸã§ã«è¡ãããäœæ¥ã«ã€ããŠã
ç°è°ããªãã£ãã®ã§ç· ãããããŸãã
ããã¯APIã«é¢ããå°æ¥ã®æ±ºå®ã«å¯Ÿããã³ã¡ã³ãã§ããç§ã¯ãã®ç¹å®ã®ãã®ãèšå®ãããŠããããšãç解ããŠããŸãã
Rotate
ã¯å°éçãªæ©èœã§ãã LTRãŸãã¯RTLã¯ãã³ã³ããã¹ããäžããããå Žåã«ã®ã¿é¢é£ããŸãã @aclementsã¯ãæå¹ãªè³ªåãæèµ·ããŸããããæå¹ãªæ¡åŒµãã€ã³ãã§ã¯ãããŸããã 圌ã®è³ªåã¯ããæŽæ°ãå¢å ããã®ãšåãããã«ãRTLã§ãããšçããããå¯èœæ§ããããŸãã ç°¡åã§ãããïŒ
ãããã代ããã«ãè³¢ããç¶ããŸãã
ãã¹ãã·ã£ãªã¹ãæ©èœããšã¯ããšãŠãåçŽãªããšã§ãããã«åŽäžãããå¯èœæ§ããããŸãã ã³ãŒããµã³ãã«ãèãããšãã³ãŒãè¡ã«ééããåã§ãã£ãŠããçºçããå転ãšæ¹åããã§ã«ç解ããŠããå¯èœæ§ããããŸãã ãã®ãããªã³ãŒãã®åã«ã¯ãéåžžã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
æãåèã«ãªãã³ã¡ã³ã
ã³ãŒããæžããŠãã人ã¯ãå·Šã«å転ããããå³ã«å転ãããããããšæã£ãŠããŸãã ããã«å¿ããŠã圌ãã¯å·Šã«ãå³ã«ãå転ããããããŸããã å·Šå転ã®ã¿ãæäŸããå Žåãå³å転ãåžæãã人ã¯ãå³å転ãå·Šå転ã«å€æããåŒãäœæããå¿ èŠããããŸãã ããã¯ãã³ã³ãã¥ãŒã¿ãŒãç°¡åã«å®è¡ã§ããçš®é¡ã®è¡šçŸã§ãããããã°ã©ããŒã¯ééããç¯ããŸãã ãªãããã°ã©ããŒã«èªåã§æžãããã®ã§ããããïŒ