{"id":245,"date":"2021-04-08T18:44:59","date_gmt":"2021-04-08T10:44:59","guid":{"rendered":"https:\/\/blogs.gongqilin.cn\/?p=245"},"modified":"2021-04-08T18:44:59","modified_gmt":"2021-04-08T10:44:59","slug":"%e4%b8%8d%e5%b8%b8%e8%a7%81%e4%bd%86%e6%98%af%e6%95%88%e7%8e%87%e5%be%88%e9%ab%98%e7%9a%84%e7%ae%97%e6%b3%95","status":"publish","type":"post","link":"https:\/\/blogs.gongqilin.cn\/?p=245","title":{"rendered":"\u4e0d\u5e38\u89c1\u4f46\u662f\u6548\u7387\u5f88\u9ad8\u7684\u7b97\u6cd5"},"content":{"rendered":"<pre class=\"prettyprint linenums\">int func(uint32 x){\r\n    int countx = 0;      \r\n    while( x )      \r\n    {          \r\n        countx ++;          \r\n        x = x&amp;(x-1);      \r\n    }  \r\n    return countx;  \r\n} \r\n<\/pre>\n<p>\u8fd9\u662f\u7edf\u8ba1x\u7684\u4e8c\u8fdb\u5236\u6570\u503c\u4e2d\u6709\u591a\u5c11\u4e2a1\u7684\u51fd\u6570\uff0c\uff081000 \uff09b &#8211; 1 = \uff080111\uff09b\uff0c\u6b63\u597d\u662f\u539f\u6570\u53d6\u53cd\u3002\u8fd9\u5c31\u662f\u539f\u7406\u3002 \u7528\u8fd9\u79cd\u65b9\u6cd5\u6765\u6c421\u7684\u4e2a\u6570\u662f\u5f88\u6548\u7387\u5f88\u9ad8\u7684\u3002 \u4e0d\u5fc5\u53bb\u4e00\u4e2a\u4e00\u4e2a\u5730\u79fb\u4f4d\u3002\u5faa\u73af\u6b21\u6570\u6700\u5c11\u3002<br \/>\n\u59820x0b\u7684\u4e8c\u8fdb\u5236\u4e3a1011\uff0c\u5faa\u73af\u7b2c\u4e00\u6b21countx = 1\uff1bx = 1011 &amp; 1010 = 1010\uff1b<br \/>\n\u5faa\u73af\u7b2c\u4e8c\u6b21countx = 2\uff1bx = 1010 &amp; 1001 = 1000\uff1b<br \/>\n\u5faa\u73af\u7b2c\u4e8c\u6b21countx = 3\uff1bx = 1000 &amp; 0111 = 0000\uff1b<br \/>\n\u8df3\u51fa\u5faa\u73af\uff0c\u8fd9\u4e2a\u65f6\u5019countx\u4e3a3\uff0c\u8bf4\u660e0x0b\u6709\u4e09\u4f4dbit\u4e3a1<\/p>\n<pre class=\"prettyprint linenums\">#define is_pow_tow(v)  ((v) &amp;&amp; !((v) &amp; ((v) - 1)))\r\n<\/pre>\n<p>\u7528\u4e8e\u5224\u65ad\u662f\u5426\u662f2\u7684\u5e42\uff0c\u539f\u7406\u662f\u5982\u679cv\u662f2\u7684\u5e42\uff0cv\u7684\u4e8c\u8fdb\u5236\u6700\u9ad8\u4f4d\uff08\u8fd9\u91cc\u53ea\u4ee3\u8868\u53ef\u4ee5\u5b58\u653e\u4e0b\u8fd9\u4e2av\u7684\u6700\u5c0f\u7684\u4f4d\uff09\u5fc5\u5b9a\u662f1\uff0c\u540e\u9762\u5168\u662f0\uff0cv-1\u7684\u4e8c\u8fdb\u5236\u6700\u9ad8\u4f4d\u5fc5\u5b9a\u662f0\uff0c\u540e\u9762\u5168\u662f1\uff0c\u6240\u4ee5\uff08v &amp; \uff08v-1\uff09\uff09\u5fc5\u5b9a\u4e3a0.\u5982\u679cv\u4e0d\u662f2\u7684\u5e42\uff0cv-1\u7684\u6700\u9ad8\u4f4d\u5fc5\u5b9a\u4e0d\u4f1a\u6539\u53d8\uff0c\u59821001\uff0c1001&amp;1000\uff0c\u90a3\u4e48\u8fd9\u4e2a\u503c\u5fc5\u5b9a\u4e0d\u4e3a0.<\/p>\n<pre class=\"prettyprint linenums\">#define ALIGN(size, align)                 ((align + size - 1) &amp; (~ (align - 1)))\r\n#define ALIGN_4BYTE(size)                  ((4 + size - 1) &amp; (~ (4 - 1)))\r\n#define ALIGN_8BYTE(size)                  ((8 + size - 1) &amp; (~ (8 - 1)))\r\n<\/pre>\n<p>\u8be5\u5b8f\u5b9a\u4e49\u7528\u4e8e\u8ba1\u7b97\u5b57\u8282\u5bf9\u9f50\uff0calign\u4e3a2\u7684\u5e42\uff0csize\u4e3a\u5b9e\u9645\u5927\u5c0f\u3002<br \/>\n\u59824\u5b57\u8282\u5bf9\u9f50\uff0c\u73b0\u5728\u6211\u6709\u4e2a\u7ed3\u6784\u4f53\uff0c\u5176\u5927\u5c0f\u4e3a6\u5b57\u8282\uff0c\u90a3\u4e48\u8fd9\u4e2a\u7ed3\u6784\u4f53\u9700\u8981\u7684\u5b58\u50a8\u7a7a\u95f4\u5927\u5c0f\u4e3aALIGN(6, 4);\u4e5f\u53ef\u662f\u4f7f\u7528ALIGN_4BYTE(6)\uff0c((4 + size &#8211; 1) &amp; (~ (4 &#8211; 1)))\u8ba1\u7b97\u51fa\u6765\u540e\u4e3a\uff081000\uff09b \uff0c\u5171\u9700\u89818\u4e2a\u5b57\u8282\u3002\u5047\u8bbe\u8fd9\u4e2a\u9700\u8981\u7684\u5b58\u50a8\u7a7a\u95f4\u5927\u5c0f\u547d\u540d\u4e3aaddr\uff0c\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u786e\u5b9a\u4e24\u70b9<\/p>\n<ol>\n<li>addr\u5fc5\u5b9a\u662falign\u7684\u500d\u6570<\/li>\n<li>addr\u5fc5\u5b9a\u5927\u4e8e\u7b49\u4e8esize\uff0c\u4e14\u4e0d\u8d85\u8fc7 align+size\u3002<\/li>\n<li>align\u4e3a2\u7684n\u6b21\u5e42<\/li>\n<\/ol>\n<p>\u90a3\u4e48\u53ef\u4ee5\u5f97\u5230 size &lt;= addr &lt; (size + align)\uff0c\u7531\u4e8eaddr\u5fc5\u5b9a\u662falign\u7684\u500d\u6570\uff0c\u4e14align\u4e3a2\u7684\u5e42\uff0c\u90a3\u4e48align\u662f\u4e00\u4e2a\u6574\u6570\uff0c\u53ef\u4ee5\u5f97\u5230size &lt;= addraddr &lt;= (size + align &#8211; 1)\uff0c\u6211\u4eec\u6700\u540e\u60f3\u5f97\u5230\u662faddraddr = \uff1f\uff0c\u8fd9\u4e2a\u65f6\u5019\u5df2\u7ecf\u5f88\u63a5\u8fd1\u6700\u540e\u7684\u7b54\u6848\u4e86\uff0c\u6211\u4eec\u8981\u505a\u7684\u5c31\u662f\u628aaddraddr &lt;= \u53d8\u4e3aaddraddr = \uff0c\u90a3\u4e48\u5982\u4f55\u53bb\u53d8\u5462\uff1faddr\u8fd8\u5f97\u6ee1\u8db3\u4e00\u4e2a\u6761\u4ef6\u5c31\u662f\u5fc5\u5b9a\u662falign\u7684\u500d\u6570\uff0c\u90a3\u4e48addr % align\u662f\u7b49\u4e8e0\u7684\uff0c\u6240\u4ee5\u4e5f\u5c31\u662f\u8bf4\u4e24\u8fb9\u540c\u65f6\u9664\u53bbalign<\/p>\n<p>size\/align &lt;= addraddr \/ align\u00a0 &lt;= \uff08(size + align &#8211; 1) \/ align\uff09,\u8fd9\u4e2a\u53d8\u5e7b\u4e00\u4e0b\u5c31\u5f97\u5230\uff08\u2308\u2309\u5411\u4e0a\u53d6\u6574\uff0c\u230a\u230b\u5411\u4e0b\u53d6\u6574\uff09<\/p>\n<p>\u2308size\/align\u2309 = addraddr \/ align\u00a0 = \u230a((size + align &#8211; 1) \/ align)\u230b,\u90a3\u4e48addraddr\u00a0 = \u230a((size + align &#8211; 1) \/ align)\u230b * align\uff1b\u90a3\u4e48\u6211\u4eec\u5c31\u5f97\u5230\u4e86addraddr\uff0c\u90a3\u4e48\u600e\u4e48\u7528\u7a0b\u5e8f\u5199\u51fa\u6765\u5462\uff0c\u6211\u4eec\u77e5\u9053\u4e00\u4e2a\u6570\u9664\u4ee52\uff0c\u5b9e\u9645\u5c31\u662f\u53f3\u79fb\u4e00\u4f4d\uff0c\u4e58\u4ee52\u5c31\u662f\u5de6\u79fb\u4e00\u4f4d\uff0c\u8fd9\u6837\u4e0d\u4ec5\u65b9\u4fbf\u8ba1\u7b97\u800c\u4e14\u5927\u5927\u52a0\u5feb\u4e86\u8fd0\u7b97\u901f\u5ea6\uff0c\u4f46\u662f\u53f3\u79fb\u7684\u65f6\u5019\u5c31\u4f1a\u9020\u6210\u6700\u4f4e\u4f4d\u7684\u4e22\u5931\uff0c\u8fd9\u5c31\u662f\u4e3a\u5565C\u8bed\u8a00\u4e2d\u505a\u9664\u6cd5\u90fd\u662f\u5411\u4e0b\u53d6\u6574\u7684\u539f\u56e0\u3002\u56de\u5230\u4e3b\u9898\uff0c \u230a((size + align &#8211; 1) \/ align)\u230b * align\uff0c\u5176\u5b9e\u5c31\u662f\u53f3\u79fbn\uff082\u7684n\u6b21\u5e42\uff09\u4f4d\u540e\uff0c\u518d\u5de6\u79fbn\u4f4d\uff0c\u5176\u5b9e\u6700\u540e\u5bf9(size + align &#8211; 1)\u7684\u5f71\u54cd\u5c31\u662f\u4e22\u5931\u6700\u4f4e\u7684n\u4f4dbit\u3002 001~1~1,\u4e00\u5171n\u4e2abit\u76841\uff0c\u90a3\u4e48001~1~1 + 1\u00a0 = 001~0~0\uff0c\u540e\u9762n\u4e2a0\uff0c\u4e5f\u5c31\u662f2\u7684n\u6b21\u5e42\uff0c\u8fd9\u5c31\u662falign\u3002\u6700\u540e\u53ef\u4ee5\u5f97\u5230((align + size &#8211; 1) &amp; (~ (align &#8211; 1)))\u3002<\/p>\n<p>\u6211\u4eec\u518d\u6b21\u8ddf\u7740\u8fd9\u4e2a\u601d\u8def\u8ba1\u7b97\u4e00\u4e0bALIGN(6, 4);\u53ef\u4ee5\u77e5\u9053<\/p>\n<ol>\n<li>addr\u5fc5\u5b9a\u662f4\u7684\u500d\u6570<\/li>\n<li>addr\u5fc5\u5b9a\u5927\u4e8e\u7b49\u4e8e6\uff0c\u4e14\u4e0d\u8d85\u8fc710\u3002<\/li>\n<li>align\u4e3a2\u76842\u6b21\u5e42<\/li>\n<\/ol>\n<p>\u53ef\u4ee5\u5f97\u5230 6 &lt;= addr &lt;= 9,\u4e24\u8fb9\u9664\u4ee54\uff0c\u23081.5\u2309 = addraddr \/ align\u00a0 = \u230a2.25\u230b,\u4e5f\u5c31\u662f2 = addraddr \/ align = 2\uff1b\u4e5f\u5c31\u662faddraddr\u00a0 = 2 * \u00a0align = 2 * 4 = 8\uff1b\u5176\u4e2daddraddr\u00a0 = \u230a((size + align &#8211; 1) \/ align)\u230b * align\u5c31\u662f9\uff081001\uff09\u53f3\u79fb2\u4f4d\u5f97\u52301\uff080010\uff09\uff0c\u5de6\u79fb2\u4f4d\u5f97\u52308\uff081000\uff09\uff0c\u4e5f\u5c31\u662f\u4e22\u6389\u4e86\u6700\u4f4e\u76842\u4f4d.<\/p>\n<p>\u518d\u6bd4\u5982ALIGN(15, 8);\u5c31\u662f15+8-1=23\uff080001 0111\uff09\u53f3\u79fb3\u4f4d\uff080000 0010\uff09\uff0c\u5728\u5de6\u79fb\u4e09\u4f4d\uff080001 0000\uff09\uff0c\u663e\u793a\u5c31\u662f\u4e22\u6389\u4e86\u6700\u4f4e\u76843\u4f4d\uff0c\u4e5f\u5c31\u662fALIGN(15, 8) = 16\uff1b<\/p>\n","protected":false},"excerpt":{"rendered":"<p>int func(uint32 x){ int countx = 0; while( x ) { countx [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-245","post","type-post","status-publish","format-standard","hentry","category-c"],"_links":{"self":[{"href":"https:\/\/blogs.gongqilin.cn\/index.php?rest_route=\/wp\/v2\/posts\/245","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.gongqilin.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.gongqilin.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.gongqilin.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.gongqilin.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=245"}],"version-history":[{"count":4,"href":"https:\/\/blogs.gongqilin.cn\/index.php?rest_route=\/wp\/v2\/posts\/245\/revisions"}],"predecessor-version":[{"id":249,"href":"https:\/\/blogs.gongqilin.cn\/index.php?rest_route=\/wp\/v2\/posts\/245\/revisions\/249"}],"wp:attachment":[{"href":"https:\/\/blogs.gongqilin.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.gongqilin.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.gongqilin.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}