{"id":59,"date":"2021-05-29T00:04:56","date_gmt":"2021-05-28T16:04:56","guid":{"rendered":"http:\/\/139.224.63.49\/?p=59"},"modified":"2021-05-29T00:04:56","modified_gmt":"2021-05-28T16:04:56","slug":"%e6%8e%a2%e7%b4%a2__builtin_popcount","status":"publish","type":"post","link":"http:\/\/iamnear.top\/?p=59","title":{"rendered":"\u63a2\u7d22__builtin_popcount"},"content":{"rendered":"\n<p>g++\u63d0\u4f9b\u4e86\u4e2a\u5185\u7f6e\u7684\u51fd\u6570:__builtin_popcount,\u6765\u7edf\u8ba1\u6574\u5f62\u6570\u5b57\u7684\u4e8c\u8fdb\u5236\u8868\u793a\u4e2d1\u7684\u6570\u91cf\u3002\u6211\u5f88\u597d\u5947\uff0c\u5c31\u60f3\u770b\u770b\u5e93\u51fd\u6570\u4f7f\u7528\u4ec0\u4e48\u529e\u6cd5\u5b9e\u73b0\u7684\u3002<\/p>\n\n\n\n<p>\u4e00\u822c\u6211\u4eec\u81ea\u5df1\u6765\u5199\u8fd9\u4e2a\u51fd\u6570\uff0c\u4f1a\u662f\u8fd9\u6837\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int popcount1(int x)\n{\n    int r = 0;\n    while(x)\n    {\n        if(x&amp;1)\n            r++;\n        x = x>>1;\n    }\n    return r;\n}<\/code><\/pre>\n\n\n\n<p>\u6216\u8005\u662f\u8fd9\u6837\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int popcount2(int x)\n{\n    int r = 0;\n    while(x)\n    {\n        r++;\n        x = x&amp;(x-1);\n    }\n    return r;\n}<\/code><\/pre>\n\n\n\n<p>\u90a3\u4e48g++\u4e2d\u662f\u600e\u4e48\u5b9e\u73b0\u7684\u5462\uff1f\u7528gdb\u770b\u770b<\/p>\n\n\n\n<p>\u6d4b\u8bd5\u51fd\u6570\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;iostream>\nusing namespace std;\nint main(int argc,char** argv)\n{\n    if(argc!=3)\n        return -1;\n    int c = stoi(argv&#91;1]);\n    int d = stoi(argv&#91;2]);\n    int a = __builtin_popcount(c^d);\n    cout&lt;&lt;a&lt;&lt;endl;\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>\u5728gdb\u4e2d\uff0c\u8fd0\u884c\u5230\u8fd9\u4e2a\u51fd\u6570\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>   0x5555555552de &lt;main(int, char**)+217>:  xor    eax,DWORD PTR &#91;rbp-0x18]\n   0x5555555552e1 &lt;main(int, char**)+220>:  mov    eax,eax\n   0x5555555552e3 &lt;main(int, char**)+222>:  mov    rdi,rax\n=> 0x5555555552e6 &lt;main(int, char**)+225>:  call   0x5555555550a0 &lt;__popcountdi2@plt>\n   0x5555555552eb &lt;main(int, char**)+230>:  mov    DWORD PTR &#91;rbp-0x1c],eax\n   0x5555555552ee &lt;main(int, char**)+233>:  mov    eax,DWORD PTR &#91;rbp-0x1c]\n   0x5555555552f1 &lt;main(int, char**)+236>:  mov    esi,eax\n   0x5555555552f3 &lt;main(int, char**)+238>:  lea    rdi,&#91;rip+0x2da6]        # 0x5555555580a0 &lt;std::cout@@GLIBCXX_3.4>\n<\/code><\/pre>\n\n\n\n<p>\u770b\u5230\u8fd9\u4e2a\u51fd\u6570\u4e86\uff0c\u53eb__popcountdi2@plt\uff0c\u5173\u4e8e\u8fd9\u4e2aplt\uff0c\u6d89\u53ca\u5230\u4e86linux\u7cfb\u7edf\u4e2ddynamic shared objects\u7684\u88c5\u8f7d\u65f6\u91cd\u5b9a\u4f4d\u673a\u5236\u6709\u5173\uff0c\u8fd9\u4e2aplt\uff08Procedure LInkage Table\uff09\u6d89\u53ca\u5230\u5ef6\u8fdf\u7ed1\u5b9a\u673a\u5236\u7684\u5b9e\u73b0\u3002\u5177\u4f53\u7684\u6211\u540e\u9762\u5e94\u8be5\u4f1a\u5355\u72ec\u5199\u4e00\u4e0b\u3002<\/p>\n\n\n\n<p>\u4e0b\u9762\u770b\u770bpopcount\u51fd\u6570\u7684\u5185\u5bb9\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>=> 0x7ffff7ca50a0 &lt;__popcountdi2>:      movabs rdx,0x5555555555555555\n   0x7ffff7ca50aa &lt;__popcountdi2+10>:   mov    rax,rdi\n   0x7ffff7ca50ad &lt;__popcountdi2+13>:   shr    rax,1\n   0x7ffff7ca50b0 &lt;__popcountdi2+16>:   and    rax,rdx\n   0x7ffff7ca50b3 &lt;__popcountdi2+19>:   movabs rdx,0x3333333333333333\n   0x7ffff7ca50bd &lt;__popcountdi2+29>:   sub    rdi,rax\n   0x7ffff7ca50c0 &lt;__popcountdi2+32>:   mov    rax,rdi\n   0x7ffff7ca50c3 &lt;__popcountdi2+35>:   shr    rdi,0x2\n   0x7ffff7ca50c7 &lt;__popcountdi2+39>:   and    rax,rdx\n   0x7ffff7ca50ca &lt;__popcountdi2+42>:   and    rdi,rdx\n   0x7ffff7ca50cd &lt;__popcountdi2+45>:   movabs rdx,0xf0f0f0f0f0f0f0f\n   0x7ffff7ca50d7 &lt;__popcountdi2+55>:   add    rdi,rax\n   0x7ffff7ca50da &lt;__popcountdi2+58>:   mov    rax,rdi\n   0x7ffff7ca50dd &lt;__popcountdi2+61>:   shr    rax,0x4\n   0x7ffff7ca50e1 &lt;__popcountdi2+65>:   add    rax,rdi\n   0x7ffff7ca50e4 &lt;__popcountdi2+68>:   and    rax,rdx\n   0x7ffff7ca50e7 &lt;__popcountdi2+71>:   movabs rdx,0x101010101010101\n   0x7ffff7ca50f1 &lt;__popcountdi2+81>:   imul   rax,rdx\n   0x7ffff7ca50f5 &lt;__popcountdi2+85>:   shr    rax,0x38\n   0x7ffff7ca50f9 &lt;__popcountdi2+89>:   ret<\/code><\/pre>\n\n\n\n<p>\u8f93\u5165\u5e94\u8be5\u662fedi\uff0c\u8f93\u51fa\u662frax<\/p>\n\n\n\n<p>\u5230\u8fd9\u4e00\u6b65\u6211\u5c31\u3002\u3002\u6211\u592a\u83dc\u4e86\uff0c\u4e00\u65f6\u95f4\u770b\u4e0d\u61c2\u3002\u3002\u4e0d\u8fc7\u5e94\u8be5\u8fd8\u662f\u5f88\u597d\u7ffb\u8bd1\u6210c\u8bed\u8a00\u7684\u3002\u6211\u5728\u7f51\u4e0a\u770b\u5230\u7ffb\u8bd1\u8fc7\u7684\u4ee3\u7801\uff0c\u4f46\u662f\u73b0\u5728\u4e00\u65f6\u627e\u4e0d\u5230\u4e86\uff0c\u542c\u8bf4\u662f\u7528\u4e86\u4e8c\u5206\u6cd5\uff1f\u8303\u589e\u5e94\u8be5\u542c\u5de7\u5999\u5730\u3002\u6574\u4e2a\u51fd\u6570\u90fd\u6ca1\u6709\u4efb\u4f55\u6761\u4ef6\u8df3\u8f6c\u8bed\u53e5\uff0c\u5c31\u5b8c\u6210\u4e861\u7684\u8ba1\u6570\uff0c\u5389\u5bb3\u3002<\/p>\n\n\n\n<p>\u7b49\u6211\u770b\u61c2\u4e86\uff0c\u5c31\u628a\u8fd9\u4e00\u7ae0\u5199\u5b8c\u3002\u3002\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>g++\u63d0\u4f9b\u4e86\u4e2a\u5185\u7f6e\u7684\u51fd\u6570:__builtin_popcount,\u6765\u7edf\u8ba1\u6574\u5f62\u6570\u5b57\u7684\u4e8c\u8fdb\u5236\u8868\u793a\u4e2d1\u7684\u6570\u91cf&hellip; <a href=\"http:\/\/iamnear.top\/?p=59\" class=\"more-link read-more\" rel=\"bookmark\">\u7ee7\u7eed\u9605\u8bfb <span class=\"screen-reader-text\">\u63a2\u7d22__builtin_popcount<\/span><i class=\"fa fa-arrow-right\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-59","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"hentry","6":"category-uncategorized","7":"h-entry","9":"h-as-article"},"_links":{"self":[{"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/posts\/59","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/iamnear.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=59"}],"version-history":[{"count":1,"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/posts\/59\/revisions"}],"predecessor-version":[{"id":60,"href":"http:\/\/iamnear.top\/index.php?rest_route=\/wp\/v2\/posts\/59\/revisions\/60"}],"wp:attachment":[{"href":"http:\/\/iamnear.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=59"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/iamnear.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=59"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/iamnear.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=59"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}