8ã64ãããã®ãµã€ãºã®å€æ°ã®åäžããããã«ãŠã³ãããããã®ã¢ã«ãŽãªãºã ãžã®ã¢ãããŒãã®ããªãå®å
šãªèª¬æãããããšããèšäºãHabrã³ãã¥ããã£ã«æç€ºããããšæããŸãã ãããã®ã¢ã«ãŽãªãºã ã¯ãããããããããããžãã¯ããŸãã¯ããããã¢ã«ã±ããŒãã®ã»ã¯ã·ã§ã³ã«å±ããå€ãã®ããã°ã©ããŒã«ãã®çŸãããšéèªææ§ãé
äºããŸãã ãã®é¬éè¡ã®åºæ¬ã«è€éãªãã®ã¯äœããªãããšã瀺ããããšæããŸãããŸãããã®ãããªã¢ã«ãŽãªãºã ãæ§æããåºæ¬çãªãã¯ããã¯ã«æ
£ããããšã§ãåäžããããã«ãŠã³ãããç¬èªã®æ¹æ³ãéçºããããšããã§ããŸãã
å§ããåã«ããã®èšäºã¯ããã°ã©ãã³ã°ã®åå¿è
åãã§ã¯ãªãããšãããã«èŠåããããšæããŸãã èªè
ã«ã¯ãæãåçŽãªãããæäœïŒãããåäœã®ãandãããorããã·ããïŒã®æŠèŠã説æãã16鲿°ã·ã¹ãã ã®ååãªç¥èããããæ³ååãéåžžã«èªä¿¡ãæã£ãŠäœ¿çšããåžžã«çããããã·ãŒã±ã³ã¹ã§ã¯ãªãããšã瀺ãå¿
èŠããããŸãã å¯èœã§ããã°ããã¹ãŠã«åçãæ·»ä»ãããŸãããå®å
šãªãã¬ãŒã³ããŒã·ã§ã³ãåçŽåããã ãã§ã眮ãæãããã®ã§ã¯ãããŸããã
説æãããŠãããã¹ãŠã®ææ³ã¯Cèšèªã§å®è£
ããã32ããããš64ãããã®2ã€ã®ã¢ãŒãã§ãã¹ããããŠããŸãã ãããã£ãŠããã®èšäºãããããçè§£ããã«ã¯ãCèšèªãå°ãªããšãã»ãŒçè§£ããŠããæ¹ãè¯ãã§ãããã ãã¹ãã¯ã64ãããWindows 7äžã®ããã»ããµCore 2 Duo E8400 @ 3GHzã§è¡ãããŸãããããã°ã©ã ã®ãããã©ã³ã¿ã€ã ã®æž¬å®ã¯ã
runexeãŠãŒãã£ãªãã£ã䜿çšããŠå®è¡ãããŸããã 説æãããã¢ã«ãŽãªãºã ã®ãã¹ãŠã®ãœãŒã¹ã³ãŒãã¯ãYandexãã£ã¹ã¯
ã®ã¢ãŒã«ã€ãã§å©çšã§ããŸãããã®ã³ã³ãã€ã«ã¯Visual C ++ãIntel C ++ãGCCãããã³CLangã³ã³ãã€ã©ã§ãã§ãã¯ãããŸãããããã£ãŠãååãšããŠã誰ããèªå®
ã§çµæãããã«ãã§ãã¯ãããå Žåãåé¡ã¯ãªãã¯ãã§ãã LinuxãŠãŒã¶ãŒã¯ãèªåã®ã·ã¹ãã ã§ããã°ã©ã ã®ã©ã³ã¿ã€ã ããã¹ãããæ¹æ³ãç§ããããç¥ã£ãŠãããšæãã®ã§ãã¢ããã€ã¹ã¯ããŸããã
èªè
ã®äžã«ã¯ããããªã§åããã®ãèŠãæ¹ãç°¡åã ãšæãã人ããããããããŸããã ãã®ãããªãããªïŒ58åïŒãèšé²ããŸãããããã¬ãŒã³ããŒã·ã§ã³åœ¢åŒã§ã¯ãããã¹ãã®äžäœã«ãããã®ãšãŸã£ããåããã®ãèšå®ãããŠããŸãããããã¹ããå°ã埩掻ãããããšããŠããéã«ãå°ããã©ã€ã§å³æ Œãªã¹ã¿ã€ã«ã§ããå¯èœæ§ããããŸãã ãããã£ãŠã誰ã«ãšã£ãŠããã䟿å©ãªæ¹æ³ã§è³æãç ç©¶ããŠãã ããã
é¬éè¡ã®æ¹æ³ã®1ã€ãŸãã¯å¥ã®ã»ããã«ãã£ãŠçæãããã¢ã«ãŽãªãºã ãé çªã«èª¬æããŸããåã»ã¯ã·ã§ã³ã«ã¯ãç°ãªããµã€ãºã®å€æ°ã®åäœæéãæ¯èŒãã衚ããããæåŸã«ãã¹ãŠã®ã¢ã«ãŽãªãºã ã®èŠçŽè¡šããããŸãã ãã¹ãŠã®ã¢ã«ãŽãªãºã ã¯ã8ã64ãããã®ç¬Šå·ãªãæ°å€ã®ãšã€ãªã¢ã¹ã䜿çšããŸãã
typedef unsigned char u8; typedef unsigned short int u16; typedef unsigned int u32; typedef unsigned long long u64;
çŽ æŽãªã¢ãããŒã
æããã«ããããé¬éè¡ã¯ã€ã³ã¿ãã¥ãŒã§èŒãããã«äœ¿çšãããã®ã§ã¯ãªããããã°ã©ã ã倧å¹
ã«é«éåããããã«äœ¿çšãããŸãã äœã«é¢é£ããå éïŒ ã¿ã¹ã¯ãããè©³çŽ°ã«æãäžããæéããªããšãã«æãæµ®ãã¶ãããããªãäºçްãªããªãã¯ã«é¢é£ããŠã ãã®ãããªææ³ã¯ãããããã«ãŠã³ãããããã®åçŽãªã¢ãããŒãã§ããæ°ãããããã1ã€ãã€ããã€ããããããããèŠçŽããŠãæ°ããŒãã«ãªããŸã§æé ãç¹°ãè¿ããŸãã
u8 CountOnes0 (u8 n) { u8 res = 0; while (n) { res += n&1; n >>= 1; } return res; }
ç§ã¯ãã®äºçްãªãµã€ã¯ã«ã§äœãã«ã³ã¡ã³ãããçç±ã¯ãªããšæããŸãã nã®æäžäœãããã1ã®å Žåããµã€ã¯ã«ã¯ãæäžäœã«éããåã«æ°å€ã®ãã¹ãŠã®ããããééããå¿
èŠãããããšã¯èçŒã§æããã§ãã
å
¥åãã©ã¡ãŒã¿ãŒu8ã®ã¿ã€ããu16ãu32ãããã³u64ã«å€æŽãããšã4ã€ã®ç°ãªã颿°ãåŸãããŸãã æ··oticãšããæ¹æ³ã§æç€ºããã2
32åã®æ°åã®ã¹ããªãŒã ã§ãããããããããã¹ãããŸãããã u8ã«ã¯256ã®ç°ãªãå
¥åããŒã¿ããããŸãããäžè²«æ§ãä¿ã€ããã«ãããããã¹ãŠã®é¢æ°ãšåŸç¶ã®ãã¹ãŠã®é¢æ°ã«å¯ŸããŠ2
32åã®ä¹±æ°ãå®è¡ããåžžã«åãé åºã§å®è¡ããŸãïŒè©³çްã«ã€ããŠã¯ãã¢ãŒã«ã€ãã®ã«ãªãã¥ã©ã ã³ãŒããåç
§ããŠãã ããïŒ ïŒ
次ã®è¡šã®æéã¯ç§åäœã§ãã ãã¹ãã§ã¯ãããã°ã©ã ã3åå®è¡ãããå¹³åæéãéžæãããŸããã ãšã©ãŒã¯ã»ãšãã©0.1ç§ãè¶
ããŸããã æåã®åã¯ã³ã³ãã€ã©ã¢ãŒãïŒ32ããããœãŒã¹ã³ãŒããŸãã¯64ãããïŒãåæ ãã4ã€ã®åãå
¥åããŒã¿ã®4ã€ã®ããªã¢ã³ããæ
åœããŸãã
ã¢ãŒã | u8 | u16 | u32 | u64 |
---|
x86 | 38.18 | 72.00 | 130.49 | 384.76 |
x64 | 37.72 | 71.51 | 131.47 | 227.46 |
ã芧ã®ãšãããæäœã®é床ã¯å
¥åãã©ã¡ãŒã¿ãŒã®ãµã€ãºãšãšãã«éåžžã«èªç¶ã«å¢å ããŸãã ãã®ãªãã·ã§ã³ã¯ãæ°å€ã®ãµã€ãºã64ãããã§ãèšç®ãx86ã¢ãŒãã®å Žåãäžè¬çãªèŠåæ§ããå°ãå€ããŠããŸãã å
¥åãã©ã¡ãŒã¿ãŒã2åã«ãããšãããã»ããµãŒã¯4åã®äœæ¥ã匷ããããããšã¯æããã§ããã3åé
ãé床ã§ããåŠçã§ããªãããšãè¯ãããšã§ãã
ãã®ã¢ãããŒãã®æåã®å©ç¹ã¯ãå®è£
æã«ãã¹ãç¯ãã«ããããšã§ãããã®ããããã®æ¹æ³ã§äœæãããããã°ã©ã ã¯ãããè€éãªã¢ã«ãŽãªãºã ããã¹ãããããã®ãªãã¡ã¬ã³ã¹ã«ãªããŸãïŒããã¯ãŸãã«ç§ã®å Žåã§ããïŒã 2çªç®ã®å©ç¹ã¯ãæ±çšæ§ãšããããããµã€ãºã®çªå·ãžã®æ¯èŒçç°¡åãªç§»æ€æ§ã§ãã
æäžäœãããã®ããã€ããããªãã¯
ãã®é¬éè¡ã®ææ³ã¯ãæäžäœãããããªã»ãããããšããèãã«åºã¥ããŠããŸãã æ°ånãããã°ãæ°ånããæå°ã®1ã€ãåããåªæn = nïŒïŒn-1ïŒãå±ããããšãã§ããŸãã 以äžã®n = 232ã®å³ã¯ããã®ããªãã¯ã«ã€ããŠæåã«åŠãã 人ã
ã®ç¶æ³ãæç¢ºã«ããŸãã
ããã°ã©ã ã³ãŒãã¯ããŸã倿ŽãããŠããŸããã
u8 CountOnes1 (u8 n) { u8 res = 0; while (n) { res ++; n &= n-1;
ããã§ããµã€ã¯ã«ã¯æ°nã®åäœãšãŸã£ããåãåæ°å®è¡ãããŸãã ããã¯ãæ°å€å
ã®ãã¹ãŠã®ããããåäžã§ããææªã®å Žåãæé€ããŸããããå¹³åååŸ©åæ°ã倧å¹
ã«åæžããŸãã ãã®ã¢ãããŒãã¯ãããã»ããµã®èŠçã倧å¹
ã«è»œæžããŸããïŒ å®éã«ã¯ããã§ã¯ãããŸãããã8ãããã§ã¯ããã«æªåããŸãã çµæã®æŠèŠããŒãã«ã¯æåŸã«ãªããŸãããããã§ã¯åã»ã¯ã·ã§ã³ã«ç¬èªã®ããŒãã«ãããããšã«æ³šæããŠãã ããã
ã¢ãŒã | u8 | u16 | u32 | u64 |
---|
x86 | 44.73 | 55.88 | 72.02 | 300.78 |
x64 | 40.96 | 69.16 | 79.13 | 126.72 |
äºåèšç®
æ¥ãã§ãããŒããã¹ãã«ã«åãæ¿ããã®ã§ã¯ãªããæãçµéšã®æµ
ãéè¡åž«ã§ãããæãããšãã§ããæåŸã®ç°¡åãªããªãã¯ãèããŠã¿ãŸãããã ãã®åé¡ã®è§£æ±ºçã¯ãããé¬éè¡ã«çŽæ¥é©çšãããŸããããå®å
šãæãããã«ãç»åã¯å¿
ãèæ
®ããå¿
èŠããããŸãã 256ãš65536ã®å€ãæã€2ã€ã®ããŒãã«ãéå§ããŸãããã®ããŒãã«ã§ã¯ãèãããããã¹ãŠã®1ãã€ããš2ãã€ãã®å€ã«å¯Ÿããåçãããããäºåã«èšç®ãããŸãã
u8 BitsSetTableFF[256];
ããã§ã1ãã€ãã®ããã°ã©ã ã¯æ¬¡ã®ããã«ãªããŸãã
u8 CountOnes2_FF (u8 n) { return BitsSetTableFF[n]; }
ãã倧ããªæ°ã®ãããæ°ãèšç®ããã«ã¯ããã€ãã«åå²ããå¿
èŠããããŸãã ããšãã°ãu32ã®å Žåãæ¬¡ã®ãããªã³ãŒãããããŸãã
u8 CountOnes2_FF (u32 n) { u8 *p = (u8*)&n; n = BitsSetTableFF[p[0]] + BitsSetTableFF[p[1]] + BitsSetTableFF[p[2]] + BitsSetTableFF[p[3]]; return n; }
ãŸãã¯ã2ãã€ãã®äºåèšç®ããŒãã«ã䜿çšããå ŽåïŒ
u8 CountOnes2_FFFF (u32 n) { u16 *p = (u16*)&n; n = BitsSetTableFFFF[p[0]] + BitsSetTableFFFF[p[1]]; return n; }
ããŠãããªãã¯ãããæšæž¬ããŸãããåãªãã·ã§ã³ã®å
¥åãã©ã¡ãŒã¿ãŒnã®ãµã€ãºïŒ8ããããé€ãïŒã«ã¯ã䜿çšãã2ã€ã®ããŒãã«ã®ã©ã¡ããã«å¿ããŠãäºåèšç®ã®ããã®2ã€ã®ãªãã·ã§ã³ããããŸãã èªè
ã¯BitsSetTableFFFFFFFFããŒãã«ãååŸããã³ååŸã§ããªãçç±ãçè§£ããŠãããšæããŸããããããæ£åœåãããåé¡ãããå¯èœæ§ããããŸãã
äºåèšç®ã¯é«éã«æ©èœããŸããïŒ ãã¹ãŠãµã€ãºã«äŸåããŸãã以äžã®è¡šãåç
§ããŠãã ããã æåã¯ã·ã³ã°ã«ãã€ãã®äºåèšç®çšã§ã2çªç®ã¯ããã«ãã€ãçšã§ãã
ã¢ãŒã | u8 | u16 | u32 | u64 |
---|
x86 | 0.01 | 1.83 | 21.07 | 36.25 |
x64 | 0.01 | 1.44 | 24.79 | 26.84 |
è峿·±ãç¹ïŒx64ã¢ãŒãã®å Žåãu64ã®äºåèšç®ã¯ã¯ããã«é«éã§ãããããããããã¯æé©åæ©èœã§ãããããã¯2çªç®ã®å Žåã«ã¯çŸããŸããã
ã¢ãŒã | u8 | u16 | u32 | u64 |
---|
x86 | --- | 0.05 | 7.95 | 13.01 |
x64 | --- | 0,07 | 8.49 | 13.01 |
éèŠãªæ³šæïŒäºåèšç®ã䜿çšãããã®ã¢ã«ãŽãªãºã ã¯ã次ã®2ã€ã®æ¡ä»¶ãæºããããŠããå Žåã«ã®ã¿æçã§ãïŒ
ïŒ1ïŒè¿œå ã®ã¡ã¢ãªãããå Žåã
ïŒ2ïŒåäžãããã®æ°ãããŒãã«èªäœã®ãµã€ãºãããã¯ããã«å€ãèšç®ããå¿
èŠãããå Žåãã€ãŸãããã€ãã®åçŽãªã¢ã«ãŽãªãºã ãããŒãã«ã«äºåå
¥åããã®ã«è²»ãããæéããåãæ»ããã ãããããå®éã«ã¯åžžã«æºããããŠãããšããŸããã¯ãªæ¡ä»¶ã念é ã«çœ®ãããšãã§ããŸãã ã¡ã¢ãªèªäœãžã®ã¢ã¯ã»ã¹ãè¿
éã§ãããä»ã®ã·ã¹ãã æ©èœã®åäœãé
ããªããªãããã«ããå¿
èŠããããŸãã å®éã«ã¯ãããŒãã«ã«ã¢ã¯ã»ã¹ãããšãå
ã
ããã«ãã£ããã®ããã£ãã·ã¥ããã¹ããŒãããä»ã®ã³ãŒãã®äžéšãé
ããªãå¯èœæ§ããããŸãã æšªæ£ãããã«èŠã€ããããšã¯ãŸããããŸããããéåžžã®ããã°ã©ã ãå®è£
ããå Žåãå®éã«ãã®ãããªå·šå€§ãªæé©åãå¿
èŠãšãã人ã¯ã»ãšãã©ããŸããã
ä¹ç®ãšé€ç®ã®å°äœ
æåŸã«ãé¬éè¡é£éãããã匷åãªããŒã·ã§ã³ãåããŸãããã ä¹ç®ãšããŠããããªãã®2ã®çޝä¹ã«ããé€ç®ã®æ®ãã®å©ããåããŠãéåžžã«è峿·±ãããšãã§ããŸãã 1ãã€ãã®åªæã®ãã£ã¹ããå§ããŸãããã 䟿å®äžããaããããhããŸã§ã®ã©ãã³æåã§1ãã€ãã®ãã¹ãŠã®ãããã瀺ããŸãã çªå·nã¯æ¬¡ã®åœ¢åŒã«ãªããŸãã
ä¹ç®n '=nâ
0x010101ïŒããšãã°ãæ¥é èŸã0xãã䜿çšããŠã16鲿°ã衚ããŸãïŒã¯ã3ãã€ãã§1ãã€ãããè€è£œãããã ãã§ãã
ããã§ã24ãããã粟ç¥çã«å3ãããã®8ãããã¯ã«åå²ããŸãïŒæ¬¡ã®å³ããã¬ãŒãã®æåã®è¡ãåç
§ïŒã 次ã«ããã¹ã¯0x249249ïŒãã¬ãŒãã®2è¡ç®ïŒã§ãããåäœã®ãandãã䜿çšããŠãåãããã¯ã®2ã€ã®äžäœãããããŒãã«ããŸãã
衚ã®3è¡ç®ã¯ããã¹ã¯ã®16é²è¡šèšæ³ã説æããŠããŸãã æåŸã®è¡ã¯ãéæããçµæã瀺ããŠããŸããå
ã®ãã€ãã®ãã¹ãŠã®ãããã¯ãããããç¬èªã®3ããããããã¯ã«å«ãŸããŠããŸãããé åºã¯ç°ãªããŸãïŒé åºã¯éèŠã§ã¯ãããŸããïŒã
ããã§æ³šæïŒããã8ã€ã®ãããã¯ã远å ããå¿
èŠããããŸã-ãããŠããããã®åèšãååŸããŸãïŒ
ããæ°Aã2
k -1ã§é€ç®ããäœãããåããæ°2ã®-1ãæ³ãšããæ°Aã®kããããããã¯ã®åèšãäžããããšãããããŸãã
èšŒææ°å€AïŒãã€ããªïŒãããããã®kãããã®ãããã¯ã«åå²ããŸãïŒå¿
èŠã«å¿ããŠãæåŸã®æãå€ããŒãã®ãããã¯ã远å ã§ããŸãïŒã A iã§ içªç®ã®ãããã¯ã瀺ããŸãã æ¬¡ã«ããããã®ãããã¯ã®åèšã«å¯Ÿå¿ãã2ã®ã¹ãä¹ãæããæ°Aã®å€ãæžã蟌ã¿ãŸãã
A = A 0â
20â
k + A 1â
21â
k + ... + A N- 1â
2 ïŒN-1ïŒâ
k ã
ããã§ãNã¯ãããã¯æ°ã§ãã
次ã«ãA modïŒ2 k -1ïŒãèšç®ããŸãã
A modïŒ2 k -1ïŒ=ïŒA 0â
20â
k + A 1â
21â
k + ... + A N- 1â
2 ïŒN-1ïŒâ
k ïŒmodïŒ2 k -1ïŒ= ïŒA 0 + A 1 + ... + A N-1 ïŒmodïŒ2 k -1ïŒã
ããã¯ãè² ã§ãªãæŽæ°iã«å¯ŸããŠ2iâ
k = 1ïŒmodïŒ2 k -1ïŒïŒã§ããããã§ãã ïŒãã ããããã§ã¯ãk> 1ã®ãšãã«ããªãã¯ãæå³ããªãããšãéèŠã§ããããã§ãªããã°ãã¢ãžã¥ãŒã«1ãã©ã®ããã«è§£éããããå®å
šã«æç¢ºã§ã¯ãããŸããïŒã ãããã£ãŠã2 k -1ãæ³ãšãããããã¯ã®åèšãåŸãŸããã
ã€ãŸããåãåã£ãæ°ããã2
3 -1ïŒ7ïŒã§å²ã£ãäœããååŸããå¿
èŠããããŸãã8ãããã¯ã®åèšã¯7ãæ³ãšããŠããŸãããã®å Žåããããã®åèšã¯7ãŸãã¯8ã«ãªãå¯èœæ§ããããŸããã¢ã«ãŽãªãºã ã¯ãããã0ãš1ãè¿ããŸãã ããããèŠãŠã¿ãŸãããïŒã©ã®ãããªå Žåã«çã8ãåŸãããšãã§ããŸããïŒ n = 255ã®å Žåã®ã¿ã ãããŠãã©ã®å Žåã«0ãååŸã§ããŸããïŒ n = 0ã®å Žåã®ã¿ã ãããã£ãŠã7ã®å°äœãåã£ãåŸã®ã¢ã«ãŽãªãºã ã0ãäžããå Žåãå
¥åã§n = 0ãåãåã£ããããŸãã¯æ°ã«æ£ç¢ºã«7åäœãããããããŸãã ãã®æšè«ãèŠçŽãããšã次ã®ã³ãŒããåŸãããŸãã
u8 CountOnes3 (u8 n) { if (n == 0) return 0;
nã®ãµã€ãºã16ãããã®å Žåã8ãããã®2ã€ã®éšåã«åå²ã§ããŸãã ããšãã°ã次ã®ããã«ïŒ
u8 CountOnes3 (u16 n) { return CountOnes3 (u8(n&0xFF)) + CountOnes3 (u8(n>>8));
32ããããš64ãããã®å Žåããã®ãããªããŒãã£ã·ã§ã³ã¯çè«çã«ãæå³ããããŸããã3åã®åå²ã§ã®ä¹ç®ãšé€ç®ã®æ®ãã¯ã4åãŸãã¯8åé£ç¶ã§å®è¡ããããšéåžžã«é«äŸ¡ã«ãªããŸãã ããããç§ã¯ããªãã®ããã«ç©ºã®å Žæãäžã®è¡šã«æ®ããã®ã§ãããããªããç§ãä¿¡ããªããªããèªåã§ããããèšå
¥ããŠãã ããã åæ§ã®ããã»ããµã䜿çšããŠããå ŽåãCountBits1ããã·ãŒãžã£ã«å¹æµããçµæãåŸãããå¯èœæ§ãæãé«ããªããŸãïŒããã§SSEã䜿çšããæé©åã®å¯èœæ§ã«ã€ããŠã¯è©±ããŠããªãããããã¯å¥ã®åé¡ã§ãïŒã
ã¢ãŒã | u8 | u16 | u32 | u64 |
---|
x86 | 12,42 | 30.57 | --- | --- |
x64 | 13.88 | 33.88 | --- | --- |
ãã¡ããããã®ããªãã¯ã¯åå²ããã«å®è¡ã§ããŸããããããã¯ã«æ°å€ãåå²ãããšãã0ãã8ãŸã§ã®ãã¹ãŠã®æ°å€ããããã¯ã«å«ãŸããŠããå¿
èŠããããããã¯4ããããããã¯ïŒããã³ãã以äžïŒã®å Žåã«ã®ã¿éæã§ããŸãã 4ããããããã¯ã®åèšãå®è¡ããã«ã¯ãæ°å€ãæ£ãããè€è£œãããä¿æ°ãéžæãã2
4 -1 = 15ã«ããé€ç®ã®æ®ããååŸããŠãçµæã®ãããã¯ã远å ããå¿
èŠããããŸãã çµéšè±å¯ãªé¬éè¡åž«ïŒæ°åŠãç¥ã£ãŠããïŒã¯ã0x08040201ã®ãããªèŠçŽ ãç°¡åã«èŠã€ããããšãã§ããŸãã ãªã圌ã¯ãã®ããã«éžã°ããã®ã§ããïŒ

å®éã«ã¯ãå
ã®æ°ã®ãã¹ãŠã®ãããã4ããããããã¯ã®æ£ããäœçœ®ãå ããå¿
èŠãããïŒäžã®å³ïŒã8ãš4ã¯æ¯èŒççŽ æ°ã§ã¯ãªããããéåžžã®8ãããã®4åã®ã³ããŒã§ã¯æ£ããå ŽæãåŸãããŸãããããã 9ã¯çžäºã«åçŽãª4ã§ããããããã€ãã«ãŒãã1ã€è¿œå ããå¿
èŠããããŸããã€ãŸãã9ããããè€è£œããããã«ããµã€ãºã¯36ãããã§ãããå
ã®ãã€ãã®ãã¹ãŠã®ãããã4ããããããã¯ã®äžäœã«ããæ°å€ãååŸããŸãã åãããã¯ã®3ã€ã®æäžäœãããããªã»ããããããã«ã0x111111111ïŒäžã®å³ã®2è¡ç®ïŒã®ãããåäœã®ãandããåãã ãã§ãã æ¬¡ã«ããããã¯ãæãç³ãå¿
èŠããããŸãã
ãã®ã¢ãããŒãã䜿çšãããšããã€ãå
ã®åäžããããèšç®ããããã°ã©ã ã¯éåžžã«ç°¡åã«ãªããŸãã
u8 CountOnes3_x64 (u8 n) { return ((u64)0x08040201*n & 0x111111111) % 15; }
ããã°ã©ã ã®æ¬ ç¹ã¯æããã§ãã64ãããã®ç®è¡æŒç®ãè¡ã£ãŠããã®åŸã®çµæããã¹ãŠè¡ãå¿
èŠããããŸãã å®éã«ã¯ããã®ããã°ã©ã ã¯64ã®ãã¡33ãããã®ã¿ã䜿çšããããšã«æ°ä»ããŸãïŒæäžäœ3ãããã¯ãªã»ãããããŸãïŒãååãšããŠããããã®èšç®ã32ãããç®è¡ã«è»¢éããæ¹æ³ãçè§£ã§ããŸããããã®ãããªæé©åã«é¢ãã話ã¯ãã®ãããã¯ã«ã¯å«ãŸããŠããŸããã¬ã€ãã ãšããããããã¯ããã¯ãå匷ããŠã¿ãŸããããç¹å®ã®ã¿ã¹ã¯ã®ããã«æ¢ã«èªåã§ããããæé©åããå¿
èŠããããŸãã
ãã®ããªãã¯ãæ£ããæ©èœããããã«ã倿°nã®ãµã€ãºã®åé¡ã«çããŸãã 15ã§é€ç®ããæ®ãã®éšåã䜿çšããããããã®ãããªå€æ°ã¯14ããããè¶
ãããµã€ãºãæã€ããšã¯ã§ããŸãããããããªããšã以åãšåæ§ã«åå²ãé©çšããå¿
èŠããããŸãã ãã ãã14ãããã®å Žåããã¹ãŠã®ããããæå®ã®äœçœ®ã«åãŸãããã«14ãããã«1ã€ã®ãŒãã远å ãããšãåä¿¡ãæ©èœããŸãã ããã§ãå
šäœãšããŠãåä¿¡ã®æ¬è³ªãåŠã³ãè€è£œã®ä¹æ°ãšäžèŠãªããããèªåã§ãªã»ããããããã®ãã¹ã¯ãç°¡åã«éžæã§ãããšä»®å®ããŸãã 宿ããçµæãããã«è¡šç€ºããŸãã
u8 CountOnes3_x64 (u14 n) {
äžèšã®ããã°ã©ã ã¯ã14ãããã®å€æ°ã笊å·ãªãã®å Žåãã³ãŒããã©ã®ããã«èŠãããã瀺ããŠããŸãã åãã³ãŒãã15ãããã®å€æ°ã§æ©èœããŸããããã®ãã¡ã®14ã®ã¿ã1ã«çãããšããæ¡ä»¶ã®äžã§ããŸãã¯n = 0x7FFFã®å Žåãåå¥ã«èª¿ã¹ãŸãã ã¿ã€ãu16ã®å€æ°ã«æ£ããã³ãŒããæžã蟌ãã«ã¯ãããããã¹ãŠãçè§£ããå¿
èŠããããŸãã ã¢ã€ãã¢ã¯ãæåã«æäžäœãããããåãã§ããæ®ãã®15ãããæ°ã®ããããã«ãŠã³ãããŠããããããããªãããããã远å ãçŽãããšã§ãã
u8 CountOnes3_x64 (u16 n) { u8 leastBit = n&1;
n 32ãããã®å Žåãããæ·±å»ãªé¡ãæ¢ã«æãæµ®ãã¹ãå¿
èŠããããŸã...æåã«ãçãã¯6ãããã®ã¿ã«åãŸããŸãããn = 2
32 -1ã®å¥ã®ã±ãŒã¹ãèæ
®ãã5ãããã®ãã£ãŒã«ãã§å·éã«èšç®ãè¡ãããšãã§ããŸãã ããã«ããã¹ããŒã¹ãç¯çŽãããnã®32ããããã£ãŒã«ãããããã12ãããã®3ã€ã®éšåã«åå²ã§ããŸãïŒã¯ããæåŸã®ãã£ãŒã«ãã¯å®å
šã§ã¯ãããŸããïŒã 12â
5= 60ãªã®ã§ã1ã€ã®12ããããã£ãŒã«ãã5åè€è£œããŠä¿æ°ãéžæãã5ããããããã¯ã远å ããŠãæ®ãã®31ã§é€ç®ããŸãããããåãã£ãŒã«ãã§3åè¡ãå¿
èŠããããŸãã çµæãèŠçŽãããšã次ã®ã³ãŒããåŸãããŸãã
u8 CountOnes3_x64 ( u32 n ) { if (n == 0) return 0; if (n + 1 == 0) return 32; u64 res = (n&0xFFF)*0x1001001001001llu & 0x84210842108421llu; res += ((n&0xFFF000)>>12)*0x1001001001001llu & 0x84210842108421llu; res += (n>>24)*0x1001001001001llu & 0x84210842108421llu; res %= 0x1F; if (res == 0) return 31; return res; }
ããã§ãåæ§ã«ã3ã€ã®ãã©ã³ãã®ä»£ããã«ãé€ç®ãã3ã€ã®æ®åºãåãããšãã§ããŸãããããã©ã³ããªãã·ã§ã³ãéžæããŸãããããã¯ãç§ã®ããã»ããµã§ããè¯ãæ©èœããŸãã
64ãããã®ãµã€ãºã§ããnã«ã€ããŠã¯ãä¹ç®ãå ç®ãããã»ã©å€ããªãé©åãªåªæãæãä»ãããšãã§ããŸããã§ããã 6ãŸãã¯7ã®ããããã倿ããããã¯ãã®ãããªã¿ã¹ã¯ã«ã¯å€ãããŸãã ãã1ã€ã®ãªãã·ã§ã³ã¯ã128ãããæŒç®ã䜿çšããããšã§ããããããã©ã®ãããªãããŒã«ããã¯ããè¡ãã®ãããããªããããæºåã®ã§ããŠããªãã¡ã€ãžãå£ã«æããããšãã§ããŸã:)
ä»äºã®æéãããèŠãŠã¿ãŸãããã
ã¢ãŒã | u8 | u16 | u32 | u64 |
---|
x86 | 39.78 | 60.48 | 146.78 | --- |
x64 | 6.78 | 12.28 | 31.12 | --- |
ãã®è¡šããæãããªçµè«ã¯ãäžè¬çã«ã¢ã«ãŽãªãºã ã¯æªããªããã®ã®ã32ãããå®è¡ã¢ãŒãã§ã¯64ãããæŒç®ã¯ããŸãèªèãããªããšããããšã§ãã ã±ãŒã¹u32ïŒ24.79 sïŒã®ã·ã³ã°ã«ãã€ãããŒãã«ã®x64ã¢ãŒãã§ã®äºåèšç®ã¢ã«ãŽãªãºã ã®é床ãæãåºãã°ããã®ã¢ã«ãŽãªãºã ã¯ããã25ïŒ
é
ããŠããããšããããããããæ¬¡ã®ã»ã¯ã·ã§ã³ã§å
·äœåãããç«¶äºã®çç±ã§ãã
å°äœãä¹ç®ãšã·ããã«çœ®ãæãã
æ®ããååŸããæäœã®æ¬ ç¹ã¯èª°ã«ãšã£ãŠãæããã§ãã ããã¯éšéã§ãããéšéã¯é·ãã§ãã ãã¡ãããçŸä»£ã®ã³ã³ãã€ã©ãŒã¯é¬éè¡ãç¥ã£ãŠãããé€ç®ãä¹ç®ãšã·ããã§çœ®ãæããæ¹æ³ãç¥ã£ãŠãããå°äœãåŸãã«ã¯ã逿°ãã逿°ãæããåãåŒãå¿
èŠããããŸãã ããããããã¯ãŸã é·ãæéã§ãïŒ ã³ãŒãã¹ãã«ãã£ã¹ã¿ãŒã®å€ä»£ã®å·»ç©ã«ã¯ã以åã®ã¢ã«ãŽãªãºã ãæé©åããè峿·±ãæ¹æ³ãä¿åãããŠããŸããã kããããããã¯ãèŠçŽããã«ã¯ãé€ç®ã®æ®ãã®éšåã䜿çšããã®ã§ã¯ãªãããããã¯ã远å ããŠãããããªã»ãããããã¹ã¯ã«ããå¥ã®ä¹ç®ã䜿çšããŸãã ãµã€ãºãn 1ãã€ãã®å Žåãæ¬¡ã®ããã«ãªããŸãã
ãŸãããã€ããå床3åè€è£œããäžèšã§æ¢ã«æž¡ãããåŒ0x010101â
nïŒ0x249249ã䜿çšããŠãå3ããããããã¯ã®æäžäœ2ããããåé€ããŸãã
䟿å®äžãå3ããããããã¯ã«å€§æåã®ã©ãã³æåãä»ããŸããã æ¬¡ã«ãçµæã«åããã¹ã¯0x249249ãæããŸãã ãã¹ã¯ã¯å3çªç®ã®äœçœ®ã«1ã€ã®ããããå«ãããããã®ä¹ç®ã¯ããèªäœã®æ°ã8åå ç®ããã®ãšåãã§ãæ¯å3ãããã®ã·ããããããŸãã
äœãèŠããŸããïŒ ããã21ãã23ã¯é©åãªéãæäŸããŸãïŒ ããã«ãå³åŽã®ãããã¯ã®ãªãŒããŒãããŒã¯ãã©ã®ãããã¯ã«ã7ãè¶
ããæ°ããªããããäžå¯èœã§ããå¯äžã®åé¡ã¯ãåèšã8ã®å Žåã0ãåŸãããããšã§ãããã±ãŒã¹ã¯åå¥ã«æ€èšã§ããŸãã
u8 CountOnes3_x64_m (u8 n) { if (n == 0xFF) return 8; return ((u64(0x010101*n & 0x249249) * 0x249249) >> 21) & 0x7; }
å®éãåã®ã»ã¯ã·ã§ã³ã®ã³ãŒãã䜿çšããä¹ç®ãã·ãããããã³ãããåäœã®ãAndãã«ãã7ã§ã®é€ç®ã®æ®ããæåŸã«äœ¿çšããããšã§çœ®ãæããŸããã ãã ãã3ã€ã®ãã©ã³ãã®ä»£ããã«ã1ã€ã ããæ®ããŸãã
åæ§ã®ããã°ã©ã ã16ãããã§ã³ã³ãã€ã«ããã«ã¯ãåã®ã»ã¯ã·ã§ã³ã®ã³ãŒãã䜿çšããå¿
èŠããããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ã15ã«ããé€ç®ã®æ®ããååŸããŠãã®æé ãä¹ç®ã«çœ®ãæããæ¹æ³ã瀺ããŸãã åæã«ãã©ã®æ¡ä»¶ãã³ãŒãããåé€ã§ããããç°¡åã«ç¢ºèªã§ããŸãã
u8 CountOnes3_x64_m (u16 n) { u8 leastBit = n&1;
32ãããã«ã€ããŠãåãããšãè¡ããŸããåã®ã»ã¯ã·ã§ã³ã®ã³ãŒãã䜿çšããçŽã«å°ãæžããŠãå°äœãä¹ç®ã«çœ®ãæããå Žåã®ã·ãããã©ããªãããçè§£ããŸãã
u8 CountOnes3_x64_m ( u32 n ) { if (n+1 == 0) return 32; u64 res = (n&0xFFF)*0x1001001001001llu & 0x84210842108421llu; res += ((n&0xFFF000)>>12)*0x1001001001001llu & 0x84210842108421llu; res += (n>>24)*0x1001001001001llu & 0x84210842108421llu; return (res*0x84210842108421llu >> 55) & 0x1F; }
64ãããã®å Žåãããã»ããµãã¹ããŒããšããŠæ©èœãããªããããªãã®ãæãã€ããŸããã§ããã
ã¢ãŒã | u8 | u16 | u32 | u64 |
---|
x86 | 12.66 | 42.37 | 99.90 | --- |
x64 | 3,54 | 4,51 | 18.35 | --- |
x64ã¢ãŒãã®çµæã«åãã§é©ããã äºæ³ã©ãããu32ã®å Žåã1ãã€ãã®ããŒãã«ã䜿çšããŠäºåèšç®ãããçŽããŸããã äºåèšç®ã远ãè¶ãããšããå¯èœã§ããïŒ è¯ã質å:)
䞊åå ç®
ãããããããæãäžè¬çãªããªãã¯ã§ãããéåžžã«å€ãã®å Žåãçµéšã®å°ãªãã¹ãã«ãã£ã¹ã¿ãŒã次ã
ã«ç¹°ãè¿ããæ£ç¢ºã«æ©èœããæ¹æ³ãçè§£ããŠããŸããã
1ãã€ãããå§ããŸãããã ãã€ãã¯2ãããã®4ã€ã®ãã£ãŒã«ãã§æ§æãããæåã«ãããã®ãã£ãŒã«ãã®ããããå ç®ããŠã次ã®ããã«èšããŸãã
n = (n>>1)&0x55 + (n&0x55);
以äžã«ããã®æäœã®èª¬æå³ã瀺ããŸãïŒåãšåæ§ã«ã1ãã€ãã®ããããæåã®ã©ãã³æåã§ç€ºããŸãïŒã
1ã€ã®ãããåäœã®ANDã¯å2ããããããã¯ã®äžäœãããã®ã¿ãæ®ãã2çªç®ã¯äžäœããããæ®ããŸãããããããäžäœãããã«å¯Ÿå¿ããäœçœ®ã«ã·ããããŸããåèšã®çµæãšããŠãå2ããããããã¯ïŒäžã®å³ã®æåŸã®è¡ïŒã®é£æ¥ãããã®åèšãååŸããŸããæ¬¡ã«ã2ããããã£ãŒã«ãã®æ°å€ããã¢ã«ããŠãçµæã2ã€ã®4ããããã£ãŒã«ãã«å
¥ããŸãã n = (n>>2)&0x33 + (n&0x33);
次ã®å³ã¯çµæã説æããŠããŸããç§ã¯ãã以äžèŠåŽããã«ä»æã£ãŠããŸãïŒæåŸã«ã4ããããã£ãŒã«ãã«2ã€ã®æ°å€ã远å ããŸãã n = (n>>4)&0x0F + (n&0x0F);
åæ§ã«ã2ã®çޝä¹ã«çããä»»æã®ãããæ°ã«åä¿¡ãæ¡åŒµã§ããŸããã¹ãã«è¡ã®æ°ã¯ããããæ°ã®2é²å¯Ÿæ°ã§ããã¢ã€ãã¢ãçè§£ãããã以äžã«èšè¿°ãããŠãã4ã€ã®é¢æ°ãç°¡åã«èŠãŠãçè§£ãæ£ããããšã確èªããŠãã ããã u8 CountOnes4 (u8 n) { n = ((n>>1) & 0x55) + (n & 0x55); n = ((n>>2) & 0x33) + (n & 0x33); n = ((n>>4) & 0x0F) + (n & 0x0F); return n; }
u8 CountOnes4 (u16 n) { n = ((n>>1) & 0x5555) + (n & 0x5555); n = ((n>>2) & 0x3333) + (n & 0x3333); n = ((n>>4) & 0x0F0F) + (n & 0x0F0F); n = ((n>>8) & 0x00FF) + (n & 0x00FF); return n; }
u8 CountOnes4 (u32 n) { n = ((n>>1) & 0x55555555) + (n & 0x55555555); n = ((n>>2) & 0x33333333) + (n & 0x33333333); n = ((n>>4) & 0x0F0F0F0F) + (n & 0x0F0F0F0F); n = ((n>>8) & 0x00FF00FF) + (n & 0x00FF00FF); n = ((n>>16) & 0x0000FFFF) + (n & 0x0000FFFF); return n; }
u8 CountOnes4 (u64 n) { n = ((n>>1) & 0x5555555555555555llu) + (n & 0x5555555555555555llu); n = ((n>>2) & 0x3333333333333333llu) + (n & 0x3333333333333333llu); n = ((n>>4) & 0x0F0F0F0F0F0F0F0Fllu) + (n & 0x0F0F0F0F0F0F0F0Fllu); n = ((n>>8) & 0x00FF00FF00FF00FFllu) + (n & 0x00FF00FF00FF00FFllu); n = ((n>>16) & 0x0000FFFF0000FFFFllu) + (n & 0x0000FFFF0000FFFFllu); n = ((n>>32) & 0x00000000FFFFFFFFllu) + (n & 0x00000000FFFFFFFFllu); return n; }
䞊åå ç®ã¯ããã§çµãããŸããããã®ã¢ã€ãã¢ã¯ãåãããã§åãããããã¹ã¯ã2å䜿çšãããããšã芳å¯ããããšã§éçºã§ããŸããå¯èœã§ãããããã«ã¯ã§ããŸãããu32ã®ã³ãŒããäŸã«ãšããšã次ã®ããšãã§ããŸãïŒã³ã¡ã³ããåç
§ïŒã u8 CountOnes4 (u32 n) { n = ((n>>1) & 0x55555555) + (n & 0x55555555);
æŒç¿ãšããŠã次ã®ã³ãŒããåã®ã³ãŒããæ£ç¢ºã«åæ ããçç±ãèªåã§èšŒæããããšæããŸããæåã®è¡ã§ã¯ããã³ãã瀺ããŸãããããã«ã¯èª¿ã¹ãŸããã u8 CountOnes4_opt (u32 n) { n -= (n>>1) & 0x55555555; n = ((n>>2) & 0x33333333 ) + (n & 0x33333333); n = ((n>>4) + n) & 0x0F0F0F0F; n = ((n>>8) + n) & 0x00FF00FF; n = ((n>>16) + n); return n; }
ä»ã®ããŒã¿åã§ãåæ§ã®æé©åãªãã·ã§ã³ãå¯èœã§ãã2ã€ã®ããŒãã«ã以äžã«ãªã¹ãããŸãã1ã€ã¯éåžžã®äžŠååèšçšããã1ã€ã¯æé©åçšã§ããã¢ãŒã | u8 | u16 | u32 | u64 |
---|
x86 | 7.52 | 14.10 | 21.12 | 62.70 |
x64 | 8.06 | 11.89 | 21.30 | 22.59 |
ã¢ãŒã | u8 | u16 | u32 | u64 |
---|
x86 | 7.18 | 11.89 | 18.86 | 65.00 |
x64 | 8.09 | 10.27 | 19,20 | 19,20 |
äžè¬ã«ãæé©åãããã¢ã«ãŽãªãºã ã¯ããŸãæ©èœããŸãããu64ã®x86ã¢ãŒãã§ã¯éåžžã®ã¢ã«ãŽãªãºã ã«è² ããŠããŸããçµã¿åãããæ¹æ³
åäžããããã«ãŠã³ãããããã®æé©ãªãªãã·ã§ã³ã¯ãäžŠåæ³ïŒæé©åããïŒãšããããã¯ã®åèšãèšç®ããä¹ç®ã䌎ãè€è£œæ³ã§ããããšãããããŸããäž¡æ¹ã®æ¹æ³ãçµã¿åãããŠãçµã¿åãããã¢ã«ãŽãªãºã ãååŸã§ããŸããæåã«è¡ãããšã¯ã䞊åã¢ã«ãŽãªãºã ã®æåã®3è¡ãå®äºããããšã§ããããã«ãããæ°å€ã®åãã€ãã®æ£ç¢ºãªãããæ°ãããããŸããããšãã°ãu32ã®å Žåãæ¬¡ã®æé ãå®è¡ããŸãã n -= (n>>1) & 0x55555555; n = ((n>>2) & 0x33333333) + (n & 0x33333333); n = (((n>>4) + n) & 0x0F0F0F0F );
ããã§ãæ°å€nã¯4ãã€ãã§æ§æãããŸããããã¯ã4ã€ã®æ°å€ãšèŠãªãããå¿
èŠãããããã®åèšãæ¢ããŠããŸããæ°å€nã«0x01010101ãæãããšããããã®4ãã€ãã®åèšãèŠã€ããããšãã§ããŸããããªãã¯ä»ããã®ãããªä¹ç®ãäœãæå³ããã®ããããçè§£ããŠããŸããçããã©ãã«ããããæ±ºå®ãã䟿å®ã®ããã«ãç§ã¯çµµãåŒçšããŸãïŒçãã¯3ãã€ãã§ãïŒ0ããæ°ããå ŽåïŒããããã£ãŠãu32ã®çµã¿åãããããªãã¯ã¯æ¬¡ã®ããã«ãªããŸãã u8 CountOnes5 ( u32 n ) { n -= (n>>1) & 0x55555555; n = ((n>>2) & 0x33333333 ) + (n & 0x33333333); n = ((((n>>4) + n) & 0x0F0F0F0F) * 0x01010101) >> 24; return n;
圌ã¯u16ã§ãã u8 CountOnes5 (u16 n) { n -= (n>>1) & 0x5555; n = ((n>>2) & 0x3333) + (n & 0x3333); n = ((((n>>4) + n) & 0x0F0F) * 0x0101) >> 8; return n;
圌ã¯u64ã§ãã u8 CountOnes5 ( u64 n ) { n -= (n>>1) & 0x5555555555555555llu; n = ((n>>2) & 0x3333333333333333llu ) + (n & 0x3333333333333333llu); n = ((((n>>4) + n) & 0x0F0F0F0F0F0F0F0Fllu) * 0x0101010101010101) >> 56; return n;
ãã®ã¡ãœããã®é床ã¯ããã¡ã€ãã«ããŒãã«ã§ããã«ç¢ºèªã§ããŸããæçµæ¯èŒ
以äžã®2ã€ã®è¡šã調ã¹ãŠãèå³ã®ããç¬èªã®çµè«ãåºãããšãèªè
ã«ææ¡ããŸãããããã®äžã§ãããã°ã©ã ãå®è£
ããã¡ãœããã®ååãæå®ããããããã®ç¹å®ã®ã±ãŒã¹ã§æè¯ãšæãããã¢ãããŒããé·æ¹åœ¢ã®æ ã§ããŒã¯ããŸãããäºåèšç®ãåžžã«åã¡ã ãšæã£ãŠãã人ã¯ãx64ã¢ãŒãã§ã¯å°ãé©ããŸããx86ã³ã³ãã€ã«ã¢ãŒãã®æçµæ¯èŒã
x64ã³ã³ãã€ã«ã¢ãŒãã®æçµæ¯èŒã
çºèš
ãããã«ããŠãããã¡ã€ãã«ããŒãã«ãäœããã®ã¢ãããŒããæ¯æãã蚌æ ãšèŠãªããªãã§ãã ãããããã»ããµãšã³ã³ãã€ã©ã§ã¯ããã®ãããªããŒãã«ã®ããã€ãã®æ°å€ã¯å®å
šã«ç°ãªããšä¿¡ããŠãã ãããæ®å¿µãªãããã©ã®ã¢ã«ãŽãªãºã ããããã®å Žåã§ãããè¯ããªããšç¢ºä¿¡ããããšã¯ã§ããŸãããã¿ã¹ã¯ããšã«ç¹å®ã®æ¹æ³ã匷åããå¿
èŠããããæ®å¿µãªãããæ®éçãªé«éã¢ã«ãŽãªãºã ã¯ååšããŸãããç§ã¯èªåèªèº«ã«ã€ããŠç¥ã£ãŠããã¢ã€ãã¢ã®æŠèŠã説æããŸãããããããã¯ç°ãªãçµã¿åããã§ã®ç¹å®ã®å®è£
ãéåžžã«ç°ãªãå¯èœæ§ãããã¢ã€ãã¢ã§ãããããã®ã¢ã€ãã¢ãããŸããŸãªæ¹æ³ã§çµã¿åããããšãåäžã®ããããã«ãŠã³ãããããã®èšå€§ãªæ°ã®ããŸããŸãªã¢ã«ãŽãªãºã ãååŸã§ããŸããããããã®ã¢ã«ãŽãªãºã ã¯ãå Žåã«ãã£ãŠã¯é©åã§ããããšãããããŸãããæž
èŽããããšãããããŸããã ããããïŒ
UPDïŒSSE4.2ããµããŒãããããã»ããµããªããããSSE4.2ããã®POPCNTåœä»€ã¯ãã¹ããªã¹ãã«å«ãŸããŠããŸããã