{"id":446628,"date":"2025-01-31T15:02:49","date_gmt":"2025-01-31T15:02:49","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=446628"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2025-01-31T15:02:49","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=446628","title":{"rendered":"<span>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 UTF-8 \u0431\u0435\u0437 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/km\/ob\/5t\/kmob5ta2o9y3qtc2qyakr9gpooy.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/km\/ob\/5t\/kmob5ta2o9y3qtc2qyakr9gpooy.jpeg\" data-blurred=\"true\"\/><\/div>\n<p> \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c UTF-8 \u0431\u0435\u0437 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439?<\/p>\n<p> <a href=\"https:\/\/github.com\/cceckman\/unicode-branchless\/blob\/main\/src\/lib.rs\">\u0414\u0430<\/a>.<\/p>\n<h2>\u0412\u043e\u043f\u0440\u043e\u0441<\/h2>\n<p> <a href=\"https:\/\/github.com\/ngoldbaum\">\u041d\u0430\u0442\u0430\u043d \u0413\u043e\u043b\u0434\u0431\u0430\u0443\u043c<\/a> \u0437\u0430\u0434\u0430\u043b \u0432 \u0447\u0430\u0442\u0435 <a href=\"https:\/\/www.recurse.com\/scout\/click?t=8238c6d9149cbd0865752e535795d509\">Recurse<\/a> \u0432\u043e\u043f\u0440\u043e\u0441:<\/p>\n<blockquote><p>\u042f \u0437\u043d\u0430\u044e, \u043a\u0430\u043a \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c UTF-8 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446 \u043f\u043e\u0438\u0441\u043a\u0430 (\u0441\u043c. <a href=\"https:\/\/github.com\/skeeto\/branchless-utf8\">https:\/\/github.com\/skeeto\/branchless-utf8<\/a>), \u043d\u043e \u0435\u0441\u043b\u0438 \u044f \u0445\u043e\u0447\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443 UTF-8, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u0435\u0437 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439?<\/p>\n<p> \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u0430\u043a-\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430 C, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0431\u0430\u0439\u0442\u043e\u0432 UTF-8 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f? \u0418\u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430?<\/p><\/blockquote>\n<p><a name=\"habracut\"><\/a> <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430 C<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">int num_utf8_bytes_for_codepoint(uint32_t code) {     if (code &lt;= 0x7F) {         return 1;     }     else if (code &lt;= 0x07FF) {         return 2;     }     else if (code &lt;= 0xFFFF) {         if ((code &gt;= 0xD800) &amp;&amp; (code &lt;= 0xDFFF)) {             \/\/ \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u044b - \u044d\u0442\u043e \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u043a\u043e\u0434\u043e\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 UCS4             return -1;         }         return 3;         }     else if (code &lt;= 0x10FFFF) {         return 4;     }     else {         \/\/ \u043a\u043e\u0434\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u043d\u0435 \u043f\u0440\u0435\u0434\u0435\u043b\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 Unicode         return -1;     } }<\/code><\/pre>\n<\/div><\/div>\n<p> \u042f \u043f\u043e\u0440\u0430\u0437\u043c\u044b\u0441\u043b\u0438\u043b \u043d\u0430 \u044d\u0442\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u043d\u043e \u043d\u0435 \u0441\u043c\u043e\u0433 \u0441\u0445\u043e\u0434\u0443 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0435\u0437 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0438\u0441\u043a\u0430 (2^32).<\/p>\n<h2>\u041f\u043e\u0447\u0442\u0438 \u043f\u043e\u043b\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442<\/h2>\n<p> \u041d\u043e \u043f\u043e\u0442\u043e\u043c <a href=\"http:\/\/lmb.io\/\">Lorenz<\/a> \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439:<\/p>\n<blockquote><p>\u041f\u043e\u043a\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u043c\u0443\u0442\u043d\u0430\u044f \u0438\u0434\u0435\u044f: \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c 32-\u0431\u0438\u0442\u043d\u0443\u044e \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0432 utf8, \u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043d\u043e\u0432\u0430 \u0432 32-\u0431\u0438\u0442\u043d\u043e\u043c \u0441\u043b\u043e\u0432\u0435. \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445\/\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0439\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e. \u0417\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u0431\u0430\u0439\u0442\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430, \u043d\u043e \u0441\u043c\u0435\u0449\u0430\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432.<\/p><\/blockquote>\n<p> \u0410\u0433\u0430!<\/p>\n<p> \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442 12 \u0434\u043e 32 \u043d\u0443\u043b\u0435\u0439<sup>1<\/sup> \u2014 \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0438\u0441\u043a\u0430. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e \u0434\u043b\u0438\u043d\u0435 (\u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 4).<\/p>\n<p> \u042f \u0437\u0430\u043a\u0438\u043d\u0443\u043b \u0432 \u0447\u0430\u0442 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a, \u0430 \u0432\u0435\u0447\u0435\u0440\u043e\u043c \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439). \u041a\u043e\u0433\u0434\u0430 \u0442\u0435\u0441\u0442\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c, \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">\/\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432 UTF-8. \/\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0 \u0434\u043b\u044f \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043e\u0432 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430. const fn utf8_bytes_for_codepoint(codepoint: u32) -&gt; usize {     let len = LEN[codepoint.leading_zeros() as usize] as usize;      \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u044b \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044f\u043c\u0438 \u0441 \u0431\u0438\u0442\u0430\u043c\u0438.     \/\/ Rust \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 true == 1 \u0438 false == 0:     let surrogate_bit = ((codepoint &gt;= 0xD800) &amp;&amp; (codepoint &lt;= 0xDFFF)) as usize;     \/\/ \u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u044d\u0442\u043e\u0442 \u043e\u0434\u0438\u043d \u0431\u0438\u0442 \u0434\u043e \u0442\u0440\u0451\u0445 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0435\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0430\u0441\u043a\u0438 \u0434\u043b\u044f \u0434\u043b\u0438\u043d\u044b     let surrogate_mask = surrogate_bit &lt;&lt; 2 | surrogate_bit &lt;&lt; 1 | surrogate_bit;      \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u0431\u0438\u0442\u0430\u043c\u0438.     \/\/ \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043e\u043d\u0438 \u043d\u0435 \u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u044b \u0441 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439;     \/\/ \u0441\u0430\u043c\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u0434\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430 - \u044d\u0442\u043e U+10FFFF.     let exceeded_bit = (codepoint &gt; 0x10_FFFF) as usize;     let exceeded_mask = exceeded_bit &lt;&lt; 2 | exceeded_bit &lt;&lt; 1 | exceeded_bit;      len &amp; !surrogate_mask &amp; !exceeded_mask }  \/\/\/ \u0414\u043b\u0438\u043d\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439. const LEN: [u8; 33] = [     \/\/ 0-10 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,     \/\/ 11-15 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439: 4 \u0431\u0430\u0439\u0442\u0430     4, 4, 4, 4, 4,     \/\/16-20 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439: 3 \u0431\u0430\u0439\u0442\u0430     3, 3, 3, 3, 3,     \/\/ 21-24 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439: 2 \u0431\u0430\u0439\u0442\u0430     2, 2, 2, 2,     \/\/ 25-32 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439: 1 \u0431\u0430\u0439\u0442     1, 1, 1, 1, 1, 1, 1, 1, ];  \/\/\/ \u041a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443 UTF-8. \/\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0431\u0443\u0444\u0435\u0440 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435. \/\/\/ \/\/\/ \u0427\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043a \u0441\u0442\u0440\u043e\u043a\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u0431\u0430\u0439\u0442\u0430 \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \/\/\/ \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u043a \u0441\u0442\u0440\u043e\u043a\u0435 \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e (usize) \u0431\u0430\u0439\u0442\u043e\u0432. \/\/\/ \/\/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u0443\u043b\u0435\u0432\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u0434\u043b\u044f \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u043a\u043e\u0434\u043e\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a (\u0441\u0443\u0440\u0440\u043e\u0433\u0430\u0442\u043e\u0432 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430). pub fn branchless_utf8(codepoint: u32) -&gt; ([u8; 4], usize) {     let len = utf8_bytes_for_codepoint(codepoint);     let buf = [         PREFIX[len][0] | ((codepoint &gt;&gt; SHIFT[len][0]) &amp; MASK[len][0] as u32) as u8,         PREFIX[len][1] | ((codepoint &gt;&gt; SHIFT[len][1]) &amp; MASK[len][1] as u32) as u8,         PREFIX[len][2] | ((codepoint &gt;&gt; SHIFT[len][2]) &amp; MASK[len][2] as u32) as u8,         PREFIX[len][3] | ((codepoint &gt;&gt; SHIFT[len][3]) &amp; MASK[len][3] as u32) as u8,     ];      (buf, len) }  type Table = [[u8; 4]; 5];  \/\/ \u0411\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0434\u043b\u044f continuation byte. const CONTINUE: u8 = 0b1000_0000; const PREFIX: Table = [     [0u8; 4],     [0, 0, 0, 0],     [0b1100_0000, CONTINUE, 0, 0],     [0b1110_0000, CONTINUE, CONTINUE, 0],     [0b1111_0000, CONTINUE, CONTINUE, CONTINUE], ];  \/\/ \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u0430\u043c\u044b\u0435 \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0431\u0430\u0439\u0442\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0432 \u0431\u0430\u0439\u0442\u0435 0. const SHIFT: Table = [     [0u8; 4],     [0, 0, 0, 0],     [6, 0, 0, 0],     [12, 6, 0, 0],     [18, 12, 6, 0], ];  const MASK: Table = [     [0u8; 4],     [0x7f, 0, 0, 0],     [0x1f, 0x3f, 0, 0],     [0x0f, 0x3f, 0x3f, 0],     [0x07, 0x3f, 0x3f, 0x3f], ];<\/code><\/pre>\n<p> <\/p>\n<h2>\u0412\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f<\/h2>\n<p> \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 if, \u0446\u0438\u043a\u043b\u043e\u0432 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u0422\u043e \u0435\u0441\u0442\u044c, \u0432\u0440\u043e\u0434\u0435 \u0431\u044b, \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0442?<\/p>\n<p> \u2026 \u043d\u0443, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a.<\/p>\n<p> \u0415\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 <a href=\"https:\/\/godbolt.org\/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DEArgoKkl9ZATwDKjdAGFUtEywYgAzAFZSjgBk8BkwAOXcAI0xiEEkANlIAB1QFQjsGFzcPbz9k1NsBIJDwliiY%2BMtMawKGIQImYgJM909fSur0uoaCIrDI6NiE827m7Lbhxt6SssGASktUE2Jkdg4Aeg2AamwGNCxNpk25ABUAMQBaAA5Nvcxk4IIAOgBSDQBBDbXNgCVMAiWGAoDpsIiYqFRogcGOhNgQEJhNgx%2BsRNqgqJsAG5iPAwiIATwImCBwVh8JBYIhxBe70%2Brw%2BW2OqAO6BhcLwQNu90EsKZh3MxGCwFIB0SiUcB1otE2\/CWIIJRM2JJIWDIdM%2BUJhxEwaGIrIQTAImwgZjwAC9MLM5YSgQB3aIIpgszCsplwhH8wXU%2BlrNVbX7\/YiA4H0Ixw1Ho83EJn8FHBLG0HE3DB3VAPIEQBRLKPAA0KwwwxYEc5o84RRbQoHxkxE2ZexImCLShgg4iGZAIegKBQAfRMBColwgnNTghAmxMXgATJbzs8vNgjc8fAAhEyXOfLzaSJcAEWFJvNlueAHZl3TNhfNvRDSHNnOd%2BP%2B5du\/jrd2Y93hw8h8muQRZhu56Xte5Loved4rkBl6Xso3zYKcACSAAaS7LiGu6oRou53seThGj%2BWB\/ne85zguQgABIIacxyoehPg7phu5HpOcSbAAsm8QgANK0YwGErlh9EHECE7TsJ46XKQUHQZssHwchvEMPxy5cNhJ54VAX7cqRpGbBRVE0SudEMSuqn0cxrEcdxinKWZD5MCJU6Wg5ElSe8MkwXBiEoUZfH0ahk5qbh%2BFaYaOnznplHUTZ\/kroF5l3ix7GcTxvlKbFy7xfZjliS5a5uW8HkXnJ3kxSZy5eEFGkESmDzEdgun6dFaXKZVCXPElVmpWhfnlW12Xjk54n5dJGFeGe7zSRAoJUMKIYAZNx4MZN7xoIChpUM2fYDi%2B8o9h%2BoU1X%2BY6iTOukHgiJ4TYVwF\/FejDEQ%2BATYKEqGhY89COoK3aRikEDOSJqTmtheVA5ggErTdF5bOR%2Bb0JsmbENmuaVnghwRIQ5wEDaOLoAmRhetBfpmIawAmA0hiEgqBCmJdXgMfTmxcBq0piEoj3gRoIDSSBiPI4SL6EI9IW\/iOYUkYzGiqDulwaBoFkdaxR1i8RTic9Lpya7MAPjmDENQ5sWzYKohLQqSBqoiEIJCw8roIFqmDCvmusIoQxIMBi0Tsy5hwsA5ADW0okPdoYIDzd186gOYC37CiB%2BBkfR5ggvi2rXh4ZOOF4YnuYp6rc54cz6kI1mUe5xjBD69JMNwwimCqCszrOpiYjVqj6OY9juP48AhOXlscgMDG\/zMIStB4sKbrs%2BgAhgBwhrYsAzaJFqyDslUeKbDjYaHJ9%2BBGOcv0guW6ANHi%2BtE18bpXg0wBEoaoWKkCcgdSpGia5rfcXiB9eN1g6B53AsrOqukpZcA0N2D%2BpwdYXQvrdQ0v9MBNwAbHeOjNEHIMAenAumxM7Fwwf\/LBadC5Z02AQ50Kcq7uVus2RWmwwBgBzjHAOiVWIMPISggOdITzLTeHSAgeIxSbGOEwCI8NwKoVQmuDcW4xqbh8HI7hNItgBEYMAOEwoIgOWbgIUkCIkSlEhGie6X0jCbF%2BgoL0a1zCbGeqEMcUj1zjU2F4fqwtJHUOhl8DQ5xwEmP3sAcx0QUhjgYKgQ08YcTSQ0MKGJmw4kJNiUk%2BJyTEmGx9J49JTMuC%2BJ8P4wUQSowKDHJIK0RJpLSC3MKSpNThQbGrmsLgcRziTg0PksxFixxeDKQoaSXhhT9JcQM4Z6SGm4JyZOUpe8CmdNwT06Sk5hSLNwUsupGSDZbEnD4c4U52mBNmczV84NMlcGFKcpmZzLkXOuac7h\/lxpKPpJsZc8pNgr0wDQVQQcUSHDWrYJEBp0hlKsQIGxTgADyoRjgIVCHIbAJ1ricwiOAuW3Y5Zy31tYw0JVkJjhEWIumD4PEG0wtI5x256IFWgphVJsTdxUsvJhZFKK0XouFBCqFMK4WpPpaNASzLwGsrluyyF0LYXYBFZy8VdLKV8uXBoAVXAhVxI5WK7lmxVVcolRq0VWreWTXuddX0mwADqCIWAkwOEjQwd9zaGmviwFIRZUhLzwDQUQ3IjlAgaA6WgNomB4ndmU%2BJIL1qRQMni0R4jGbEupQJMlm4KV7jlWkhJ%2BqSUrgSCk7Nglk2ZNQlwZZWa02yvzaZSSTMi0yrzXww1jysXJW4pGgl7jIJlvlQm2RpaM3ytUMeWaObq0MovJhVQXAB1Sy8BOodKbVAaAnaoKdsTF0TvTXG3tGhjzLqXfEld26qDpsUZDDg8xaCcB8LwTwHAtCkFQJwb4lqFCLGWJdScXgeCkAIJoE98x\/YgB8BoR4GgvCXDiLLAAnMeUDk5LjHgSGejgkheAsAkMKq9N670cF4MUmJX7r0ntIHAWASA0AsESHQaI5BKCkfI\/QGIxAuCXC8DEmgtBCTEGKdNb9pAMbMGIHiTgH7eNn3BREbQ2o8MftI2wQQ4KGDj241gUEwAnBiFoMU7gvAsB%2ByMOIfDpB8Cr1sJ7DTN767aj7KsD9DwqjcYTBEVs\/GXBYG4zTPAKHNOkE9sQMsSgdyYB08AHu375hUAMMABQAA1PAmAbTgrFFej9\/BBAiDEOwKQMhBCKBUOofTuhTkGCMCAUw5h9B4AiMUyA8xUCJBqBp844LeCoG8wKLAlX\/rtAk%2BkBw0JRieFOYEYIfRDExFOXkNIAg%2Bt6HGzUKYyI9BWC6wILojQpunMWzYTo9RJhDemAMdb22miuBaAtw7c2RsSHmE%2BpYKxLv6HPZe7jmHNglYIMgJmjwmNAaNLgQgwcOrvtmLwPDWhtakHhI6AYHW\/2SHA48cDcQuDvvAxoScSPjyFoqAhpDpAUMotIOhprnBsMgFwyF09nBJyPf05h4H5OvNe265IIAA%3D\">\u043a\u043e\u0434 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439)<\/a> \u0432 Compiler Explorer, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 x86_64 \u0438\u043c\u0435\u0435\u0442 <strong>\u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0438\u0434\u0430 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439<\/strong>.<\/p>\n<h3>\u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439<\/h3>\n<p> \u041f\u0440\u044f\u043c\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">            test    esi, esi             je      .LBB0_1             bsr     eax, esi             xor     eax, 31             jmp     .LBB0_3     .LBB0_1:             mov     eax, 32     .LBB0_3:             mov     eax, eax<\/code><\/pre>\n<p> \u042f \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043b, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435, \u043f\u043e\u043a\u0430 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u043a\u043e\u0434. \u041f\u043e\u0445\u043e\u0436\u0435, \u00ab\u043e\u0441\u043e\u0431\u044b\u0439\u00bb \u0441\u043b\u0443\u0447\u0430\u0439 \u2014 \u044d\u0442\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0432\u0432\u043e\u0434 (<code>esi<\/code>); \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 32.<\/p>\n<p> \u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d \u044d\u0442\u043e\u0442 \u043e\u0441\u043e\u0431\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439? \u0412 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0435 Compiler Explorer \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <code>bsr<\/code> \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0440\u0430\u0432\u043d\u043e 0, \u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430 undefined.<\/p><\/blockquote>\n<p> \u0422\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445 x86_64 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435, \u0441\u043e\u043e\u0431\u0449\u0430\u044e\u0449\u0435\u0435 \u00ab32-\u0431\u0438\u0442\u043d\u043e\u0435 \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 32 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439\u00bb. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 (intrinsic) \u00ab\u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439\u00bb \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0431\u0435\u0437 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u0435\u0435!<\/p>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0433\u0440\u0430\u043d\u0438\u0446<\/h3>\n<p> \u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434, \u043f\u043e\u0445\u043e\u0436\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0433\u0440\u0430\u043d\u0438\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.<\/p>\n<pre><code class=\"cpp\">        cmp     eax, 4         ja      .LBB0_5         ... LBB0_5:         lea     rdx, [rip + .L__unnamed_5]         mov     esi, 5         mov     rdi, rax         call    qword ptr [rip + core::panicking::panic_bounds_check::h8307ccead484a122@GOTPCREL]<\/code><\/pre>\n<p> \u0412\u0441\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 (4), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 Rust.<\/p>\n<p> \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <code>LEN<\/code>, \u0442\u043e \u043c\u043e\u0433 \u0431\u044b \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u044d\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>LEN<\/code> \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 4, \u0430 \u044d\u0442\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438\u043d\u0434\u0435\u043a\u0441.<\/p>\n<p> \u041d\u043e, \u043f\u043e\u0445\u043e\u0436\u0435, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f.<\/p>\n<h2>\u0423\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p> \u0418\u0437\u043c\u0435\u043d\u0438\u0432 \u043a\u043e\u0434 \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u044f \u043a <a href=\"https:\/\/godbolt.org\/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DEArgoKkl9ZATwDKjdAGFUtEywZ7HAGTwNMAHLuAEaYxCAAzABMpAAOqAqEdgwubh568Ym2Ar7%2BQSyh4dGWmNbZDEIETMQEqe6eXCVlyZXVBLmBIWGRMeZtdemNfTUd%2BYU9AJSWqCbEyOwcAPTLANTYDGhYK0wrcgAqAGIAtAAcK5uY8X4EAHQApBoAgsuLKwBKmASzDArbK8EmKhUMLbBjoFYEBCYFYMLrEFaoKgrABuYjw4OCAE8CJhfn4IVD\/oDgcR7k8Xg9nqs9qhtuhwZC8L8LldBBDaTtzMQ\/MBSNtYrFHNtaLQVvxZv9sbiVviSFgyJSXqDwcRMGhiAyEEwCCsIGY8AAvTATSU434AdzC0KY9MwDNpkOhXJ5ZKpi0Vqw%2BX2IPz%2B9CMkIRSKNxFp\/HhflRtHR5wwl1Q11%2BEAUs1DwG10sM4JmBCOiKOwRmYN%2BUZMuImrtiJmCYoY\/2IhmQCHoCgUAH0TAQqCcICyE4IQCsTNETUc7hFsLq7gBWABCJhO49nK0kM4AInz9UaTXcAOyzykrI8reg6\/0rcdroddk5trFmtvhtt9669uOsggTJeH494JHIKhgDASAsABYA2yYVswnKBQd33H9j2PSClBqYCIHPccnEvFcvwiA8nkQvc1wQk9PiJJFsJMH4mGBC94IIxDjxnfDHkYtiVgAKmUN5sAOABJAANG5gE%2BDsNihZAAGs7XQxgKxEggxKbNVpPQCANC\/Bj2PYvcnF1N8sA\/C8J3HScOKEAAJPiDj2YTRKo5SpJk\/15Ps8SVJkjTNNY7TfKPO4ogANk4gBZR4hAAaTsxSHIk1TZIYVyYvcpy1I07ZfmHKITUgocTlIEjtK4nj%2BKEhSlLi5y5OiiqPLUrhvL8tjdP0l82VM0zOMs6zbPK2K6oSpLatSiAGsaprtIC4KOLCyKav6kaXPmlL4oajKhxHdaFwKrTfOK3jBOWxz4qWvqVpk7LCqalqoDanUOonLqrJso7KrU063OOi6JnGibmqC0Lwqis6vve6qQbeiBsq2zbcu2q62P20rXoGj7ktBiAIl%2Bv6boM%2BNrmM7BOvM57es%2ByG0eG%2BKsexv6mIBmagZRxbwfJgasZh6G4fyhGL2nYjdqI78nhIiAASoPkXMpIWRZFqIImYvxo38ddKTQH4dSoOtO27O8pXbJ87rxj9Byy0dOq3aE9xYxDT1IutsO8bAAmYu6bnoG0eTbEMEggHLMsSI11y2wPMGFx4SNWCys3oFYU2INMMxLPAdmCQgjgIc10XQZXgFdRDPTMHVgBMapDBxaUCFMK2ImI2uVi4ZUxTEJRjLrq8NBAEi7fjxOcTvQg29a99%2B3ukz640VQ1xODR0qmqbdTu4ysInqeDnXn6Q8NMO8Mj15sFUHEwQJbUEX8f5B%2BuB0EFVTA%2BSzIdW8IPEGGRMJW9ynYWEgySxRIe3gCQm7mRXuqB0z92\/goX%2B2FQHgMwAPMeK89JRDonpWBGYEHL0wg3VBcdUxgIwWnAg4c94rGjmCWOmBVDzDtHaFEYgyzJ1TunTO2dc752PKsOQDBwxfGYDiWgmI%2BSOlbugAQYAOA6jRMAOssRVTICZKUTEKws6Bh2B7fARgjg%2B3%2BEWdA1RMThwLq8R0J5qgiXMLGQyo8ZS\/DkAFWcXANDr3Xhwo8dsqE0KwOgTB2FjY2M6pPJxbYXEHH9o\/beRjjweOoZgWhPjIHQPrp4uJ3jfERCQSsFBLUUnxPSZkxuOTYl5KISQ3aGEAbAXQRAn%2BF5KlgFyWkxJ0tdwCwjk8AgmJBQrD2EwYIsdsLMWYguJcK5VZ4RWNOcZLEPSvG8IwQBCA%2BTBEgnQgQBJoSwgKCCREpFPZGBWD7BQrp1aWKdgEQcwzFwTIiArfmQ8hm7VWBoI4Ti9maOAIcsICRBwMFQDqKM6ISIaD5CClYYKIWgqheC6FkKVjLFIVwLgrzpzvJ5F80MChBySFNLiEi0gVx8gJcSvkCKnmLC4IFI4UQNBooOUcwcERcUKBIhEPkbKVgcq5aS905KsnIqiDijR6KGVZOZSRGIWS%2BSSslWSnyR5VhRGnEcaIdLPmisbveMOu1GgNz5Lqg1%2BqjV6ulvzMpVIVizilCsORmAaCqD\/vCHY6tbCwm1MkXFJyBCWKcAAeQCHsPiAQ5DYFNmcbCGhghONnm2Wes9w6nJ1NxA6AlBy9P6TXK8jz5V81nBoEZEzVz8x2jm5icKIXrhLYROckakUxrjWCv1Aag0hthZWkiZao11tjXGvkTbA3BuwH2\/1A7W3gvbYLGtXakU9tnsO5tg752jqHSsftLaibFtNXXGZ5JXgAHVoQsCLtsBOhgRInx1KYlgCRcyJBkX%2BPAog2Rat%2BNUa0tBzRMExC\/XF4KvUaxWN1Gyaa%2BkDPrtm6teaC3LiLRuDtNbYWgonaWucgVEPjs3ZOxxkq0Mwow3BrDXB8oNxw0hzDEczW71lo8RNKxZoRRAxmh5c54NQeuTB5DkHJ67glnhit5GuOqC4LxyeEQRNkYIyhvNqgNAidUGJ0F8mROcaYjWmTu5FMKfBUpzTVBkPTOlk8DgUxaCcGnLwTwHAtCkFQJwN4x6FAzDmFbeWPBSAEE0MZqYkkQCSEkDcAAnDSrgURdwzw0FEULQV9CcEkLwFgEg52Wes7ZjgvAsUgo81Z4zpA4CwCQGgFgsQ6BhHIJQQrxX6DhGIERiIIKaC0BxMQLFYtPOkDTswYgmJOBuY6wY31wRtBqiy25wrbBBC%2BoYIItroETDACcGIWgWLuC8CwN\/Iw4hsukHwPI2wb9lvWaoWqTsCw3PXFKG16MwQGxdZcFgNrVc8AJZW6QN%2BxBCxKDXJgdbwBc6eamFQAwwAFAADU8CYHNL6wUlm3P8EECIMQ7ApAyEEIoFQ6gtu6EaAYIwIBTDmH0HgYIWLIBTFQLEGCnAjhHAAp8v5bZZvgWQtBZIvwjh6XJ7megb9aCXjc6gN73IsAk79k0YbyQHBggGJ4KIjQfB%2BE6Ns8IGnMhJAENLkAsu4gJDVwwUYcIQAaasOLgQrQaga618bmwLQqgjAV2MboRvbe1FcPUTXQxnf66V4bqYjnZjzAkCZszFm2upZWPjggyAG43BOBEG4tKIC4EIP\/AKEQGq8Cy1oH6pAoQ2m6KLnz05pzx93AFk4u5ZcBYC7uCvu5pwxY4HF0gCXo2kGS7wVL6WQCZf%2B0HjgUQQ9bc7%2B53vr334S8kEAA%3D%3D%3D\">\u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0443 \u043a \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c<\/a>, \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u041d\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439. \u041a\u0430\u043a \u043e\u0442 \u043d\u0435\u0433\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f?<\/p>\n<p> \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430:<\/p>\n<pre><code class=\"rust\">let exceeded_bit = (codepoint &gt; 0x10_FFFF) as usize;<\/code><\/pre>\n<p> \u0417\u0434\u0435\u0441\u044c \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u0440\u044e\u043a \u0441 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u043e\u0432 \u0438\u0437 boolean (true \u0438\u043b\u0438 false) \u0432 integer<br \/> (1 \u0438\u043b\u0438 0). \u0421\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 Rust \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u0441 \u0442\u0430\u043a\u0438\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435; \u043e\u043d\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<sup>2<\/sup>.<\/p>\n<p> \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u044d\u0442\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f boolean \u0432 integer \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0410 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 integer?<\/p>\n<p> <strong>\u0421\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0438\u0445.<\/strong><\/p>\n<h2>\u041e\u0442\u0432\u0435\u0442<\/h2>\n<p> \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0432\u0441\u0435\u0445 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439, \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u044b:<\/p>\n<pre><code class=\"rust\">const fn utf8_bytes_for_codepoint(codepoint: u32) -&gt; usize {     let mut len = 1;     \/\/ \u0412 Rust true \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 1, \u0430 false - \u0432 0, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \"\u043f\u0440\u043e\u0441\u0442\u043e\" \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u044b.     len += (codepoint &gt; 0x7f) as usize;     len += (codepoint &gt; 0x7ff) as usize;     len += (codepoint &gt; 0xffff) as usize;      \/\/ \u041a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435:     let surrogate_bit = ((codepoint &gt;= 0xD800) &amp;&amp; (codepoint &lt;= 0xDFFF)) as usize;     let surrogate_mask = surrogate_bit &lt;&lt; 2 | surrogate_bit &lt;&lt; 1 | surrogate_bit;     let exceeded_bit = (codepoint &gt; 0x10_FFFF) as usize;     let exceeded_mask = exceeded_bit &lt;&lt; 2 | exceeded_bit &lt;&lt; 1 | exceeded_bit;      len &amp; !surrogate_mask &amp; !exceeded_mask }<\/code><\/pre>\n<p> \u0418 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u041d\u0430\u0442\u0430\u043d\u0430 \u043f\u0440\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u0439\u0442\u043e\u0432. Compiler explorer \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u0445 <a href=\"https:\/\/godbolt.org\/#g:!%28%28g:!%28%28g:!%28%28h:codeEditor,i:%28filename:%271%27,fontScale:14,fontUsePx:%270%27,j:1,lang:rust,selection:%28endColumn:2,endLineNumber:22,positionColumn:2,positionLineNumber:22,selectionStartColumn:2,selectionStartLineNumber:22,startColumn:2,startLineNumber:22%29,source:%27%23%5Bno_mangle%5D%0Aconst&amp;#43;fn&amp;#43;utf8_bytes_for_codepoint%28codepoint:&amp;#43;u32%29&amp;#43;-%3E&amp;#43;usize&amp;#43;%7B%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;let&amp;#43;mut&amp;#43;len&amp;#43;%3D&amp;#43;1%3B%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;\/\/&amp;#43;In&amp;#43;Rust,&amp;#43;true&amp;#43;casts&amp;#43;to&amp;#43;1&amp;#43;and&amp;#43;false&amp;#43;to&amp;#43;0,&amp;#43;so&amp;#43;we&amp;#43;can&amp;#43;%22just%22&amp;#43;sum&amp;#43;lengths.%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;len&amp;#43;%2B%3D&amp;#43;%28codepoint&amp;#43;%3E&amp;#43;0x7f%29&amp;#43;as&amp;#43;usize%3B%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;len&amp;#43;%2B%3D&amp;#43;%28codepoint&amp;#43;%3E&amp;#43;0x7ff%29&amp;#43;as&amp;#43;usize%3B%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;len&amp;#43;%2B%3D&amp;#43;%28codepoint&amp;#43;%3E&amp;#43;0xffff%29&amp;#43;as&amp;#43;usize%3B%0A%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;\/\/&amp;#43;Handle&amp;#43;surrogates&amp;#43;via&amp;#43;bit-twiddling.%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;\/\/&amp;#43;Rust&amp;#43;guarantees&amp;#43;true&amp;#43;%3D%3D&amp;#43;1&amp;#43;and&amp;#43;false&amp;#43;%3D%3D&amp;#43;0:%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;let&amp;#43;surrogate_bit&amp;#43;%3D&amp;#43;%28%28codepoint&amp;#43;%3E%3D&amp;#43;0xD800%29&amp;#43;%26%26&amp;#43;%28codepoint&amp;#43;%3C%3D&amp;#43;0xDFFF%29%29&amp;#43;as&amp;#43;usize%3B%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;\/\/&amp;#43;Extend&amp;#43;that&amp;#43;one&amp;#43;bit&amp;#43;into&amp;#43;three,&amp;#43;and&amp;#43;use&amp;#43;its&amp;#43;inverse&amp;#43;as&amp;#43;a&amp;#43;mask&amp;#43;for&amp;#43;length%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;let&amp;#43;surrogate_mask&amp;#43;%3D&amp;#43;surrogate_bit&amp;#43;%3C%3C&amp;#43;2&amp;#43;%7C&amp;#43;surrogate_bit&amp;#43;%3C%3C&amp;#43;1&amp;#43;%7C&amp;#43;surrogate_bit%3B%0A%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;\/\/&amp;#43;Handle&amp;#43;exceeded&amp;#43;values&amp;#43;via&amp;#43;bit-twiddling.%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;\/\/&amp;#43;Unfortunately,&amp;#43;these&amp;#43;don!%27t&amp;#43;align&amp;#43;precisely&amp;#43;with&amp;#43;a&amp;#43;leading-zero&amp;#43;boundary%3B%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;\/\/&amp;#43;the&amp;#43;largest&amp;#43;codepoint&amp;#43;is&amp;#43;U%2B10FFFF.%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;let&amp;#43;exceeded_bit&amp;#43;%3D&amp;#43;%28codepoint&amp;#43;%3E&amp;#43;0x10_FFFF%29&amp;#43;as&amp;#43;usize%3B%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;let&amp;#43;exceeded_mask&amp;#43;%3D&amp;#43;exceeded_bit&amp;#43;%3C%3C&amp;#43;2&amp;#43;%7C&amp;#43;exceeded_bit&amp;#43;%3C%3C&amp;#43;1&amp;#43;%7C&amp;#43;exceeded_bit%3B%0A%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;len&amp;#43;%26&amp;#43;!!surrogate_mask&amp;#43;%26&amp;#43;!!exceeded_mask%0A%7D%27%29,l:%275%27,n:%270%27,o:%27Rust&amp;#43;source&amp;#43;%231%27,t:%270%27%29%29,k:44.92012780022726,l:%274%27,m:100,n:%270%27,o:%27%27,s:0,t:%270%27%29,%28g:!%28%28h:compiler,i:%28compiler:r1830,filters:%28b:%270%27,binary:%271%27,binaryObject:%271%27,commentOnly:%270%27,debugCalls:%271%27,demangle:%270%27,directives:%270%27,execute:%271%27,intel:%270%27,libraryCode:%270%27,trim:%271%27,verboseDemangling:%270%27%29,flagsViewOpen:%271%27,fontScale:14,fontUsePx:%270%27,j:1,lang:rust,libs:!%28%29,options:%27-O%27,overrides:!%28%29,selection:%28endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1%29,source:1%29,l:%275%27,n:%270%27,o:%27&amp;#43;rustc&amp;#43;1.83.0&amp;#43;%28Editor&amp;#43;%231%29%27,t:%270%27%29%29,header:%28%29,k:55.07987219977275,l:%274%27,m:100,n:%270%27,o:%27%27,s:0,t:%270%27%29%29,l:%272%27,n:%270%27,o:%27%27,t:%270%27%29%29,version:4\">\u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439<\/a>.<\/p>\n<p> \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043e\u0441\u043e\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e <code>len &lt;= 4<\/code> \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u0443\u0442\u044f\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0433\u0440\u0430\u043d\u0438\u0446 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 <a href=\"https:\/\/godbolt.org\/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DEArgoKkl9ZATwDKjdAGFUtEywYgA7KUcAZPAZMADl3ACNMYhAAJmjSAAdUBUI7Bhc3D28EpJSBAKDQlgio2MtMa1sBIQImYgJ0908fK0wbVOragnyQ8MiYuPNOhszmmrruwuL%2BgEpLVBNiZHYOAHoVsDAAagAhYkNkBHoFBU3GNHwjTdQqTfPMRMCCE8fUTbkAFQAxAFoADgA6ACkGgAgmsNsCwestu8EIYANYnIibYJMAhwhibfjETbozCbACOJkw5lSm0M6E2fhIjAAXliSLiEPj4ZgAJ6bQLJYAIAhA0HgrYghgc4iYFhMQKBYCbFh4Qask61fFyoL8qEQgXQzZCTD43kEeIKEBrYCEBAmML\/NAsFYKVmYIgrMJ7BgHI4Kb4mAhUX4MnFYc7S9WQtYrTbYN0YfFMN5fP63aMPQTqsObABKjoWDCVmzCJioVEi5IYlLxmwYvRx102ADcxHhKWE2QQSZzMeX84XIqm1qG1pt3q8mOgywh5YmsMmCLjh5tzMRpaRyfF4o5ybRaAyFnmW23AldiFgyP3wxTNmK0EemWjNhAzHhaZhprvWycAO6RGOjzBl17lhdg1PU8MyzYgc3JTZ6CMdErhuJ9iFebF23rWhG0ne5UEeE4IAUBZEOANE23PeYCG%2Ba5vjCeZSxOVDiQUaZ1XiS0sUxF19kOEkFAAfW9X0IDuacQE2EwAGZohfb5AVE7A70BABWbYTF%2BaTtk2SQFIAEWXB8nxfQEvG2SFNhMqDHTMzFpM0kSfV%2BbjmzfbjsW4wSsMEASkzcghplU4zTPoGcu02KzgsUvzTNM5R02wT4AEkAA0FO2aCtKSjQtOCrwnDvDypy84KZOk2ShAACViz53iSlL5M0tKtP06IADZNgAWRBIQAGkqsYVLFPSmryROMSJMGkTflIcKIs2KKYoS7qGF67YuAygzsqgVzHgK7Aip1MqKvmxblpqhrmrazqDpqpKjuspghvEl9brGibQSmyLorixLFOq2rFOiFaspyjbBC2nbSvKyqvp6y7fvq4Kmta9qushhboe2P6Bse4aHqG8bJoimaPoun7tlE\/61tyzDNqK0G9oh5KoeJ0njrh07EaJpKmZuu6Rsx3GXtM1LRKM0FJogLtl2gnyRa8WqRdBNAcxnKhMT4uyHJJJySBczzHgpoSRPuzYpJkkTkifTLhZBCKAtlb0LIK6zlqFyaB1izF0zMCxcVMfFRHMJFXi4EtKSoMQlFnTYNGXBRXk\/W5DDh6JtE9wFYnndwLOAdEFHVa3GDhozROsvX8p2jRVC8KhsdNx9MF8\/mTOgguQpLqmTfLyuq9G3S6%2Bdhv7dTwvi6Bmcy9UQtC2rnv65BF3wxKil6HT4gCKI2i8FjMJCG%2BAh30bdA0KMXPTIHD3zE2YATFqQxWzbAgfYdkKg\/PUPaHDqyQo0EBJptvCV9QQirZ7KEAdoDHWwNqZF0jqoTSvwNAaBOqnZqrcIGiScJ\/GBnwsHTCnmbXulsIoDmwKoVspYbwzgEPiLeM4XhMjFJgZc54zD4kIM8BgtZIjh0erGCU9p\/SZ3RD\/cyf9V5AN4fCUBIiAFEWAaPNB0lsrREytlKRgDMCyIKugtBmwg6rWXqI9R1CZ5z02AvUsS9MCqCWL%2BX8dYxD0TrBvPM29d770PsAY%2BJkBxyAYNiAgJhmCtloGyZceJw7oAEGADgM4GzAExPES88pygcj3rBWM9ARzSm%2BAhV4VEAnoFqGyGehDwzlgMMQYAJIZwj05CcOQg8uAaCwVgzxZkZyWOsVgdAGiW41LHo07izTPi4NrsU\/y5kOl6i6dxcRoDJk2O6dQzRCjNhKL0fM6ZSyFErN0QDDZv5ZHGP7k3JBmwNiqJkbM05Gx9ndPEZCAystZ6ggIGyNcg4mBhCXiFJKSVlKqXUoLNS8kgUPK1DsPcmwEmYBoKofhsYFa2ErGiMk6t1QK3Pk4AA8sEd4sVghyGwMJZSoCNBhEafA7i8D4EzwxTOAmCVhLvE%2Bd8qBvz%2B5pX%2BULQFNVnpWwFn1ZcUdI5Cq0nyiKaVyUUqpdS5c2LcX4sJUK0VvLJqSq4BqjQMr4FypxXigl2BdUKoNSq7Saq%2BpSo1dq4V8r9VKs2LaxVhqHV6qdWKh5l0%2B7PKhJsAA6iqT25IV6GEqeQpkKokhkW5AwPANBRDA3VkqMUG53xMDZGw18%2BINDooEOfMGFUmUsvxD8sKHK%2BpcrUhpVVZbtjCrraa8VArtiNWVSKyO7qa1cDiJsFtbb%2Bpms7eNHR3be39r5aCuWII6UI06oWr5xa2Wlv5SZTlKluVVoHcu0KtaK5UFbXWjtW60qqC4Hu6Bokz0HurUevqqgNCXtUBeoVj7L2HolbejQPhz0Pqfd%2Bw9E7vWpyZtsZAVBgAQDfN5VKoIWAYFxFUk4BkCGmWYbcPYrYQDf0MuxN0nFji8VsjpWy9k9w8WciPR5Ryj3RGA5B6DW7lYCIQBAfShk8amWQngdskd\/j\/HLlgwZzSLbsdejbYAqA5HWVViRxy5HwEEAgHgHyXrXqifMqm1B1kDi1Ew1QRCLBeLiUU1LLdqmpr\/AlPECAq1kB6OQP8Ig3FAJGBY\/8W6MmSSuegixkzZmzP\/ACe%2BPY8RuIkAgAgsZfnBpKDqNxTABINgQA017cTXtU5\/UMhQVQjzhJIeS48s5YAfmGVS5R2IvnVOUY5TLMF1HaNVPoxFRjOH3RcSc6wTALHhP9ya4yLjB5s18dUAJoZ3XTOqZtmLUjEtGD6SgS1vDPFVbGci35sTEnQFIMTUlXj31VtmZtsl0B2moggD06gAzw0Vs9ai5sCzTArM2bsw51ATn77Slc%2B5xNrnHOoHfEEdAPmRN%2BYCwwILD3QvEAgAANVaJhoI74gcqdu7dGLBA4sJcgEg5Ly5UvKeQ69KrR6avS00hwWYtBODyV4J4DgWhSCoE4GfGcMcFhLDhqJHgpACCaHJ7MeEIBJCSH%2BAATmiBoLtXg4EaFiF4Jq%2BhOCSF4CwCQOraf08ZxwXgxoo487p%2BT0gcBYBIBtPEOgkRyCUFN%2BbqIxAuC\/FElHGgtBWzEGNGLXnpAt7MGIGyTgXPveFKxWEbQrQ9dc5tGwQQWKGDBM91gfMwAnBiDfv73gWAJRGHEPr0g%2BBLy2A4caHPljWjemWFzx45RPdoXYr7lwWBPfvZV9wXgHDiBUSUJpcUIb3G89mFQAwwAFDQ7wJgd8WK1y065\/wQQIgxDsCkDIQQigVDqBz7oLg%2BgQ0gFMOYfQeAwjGkgLMVA8RKg5k4N8LFvBUBt8XFgI\/LGygVFSA4UswxPCb\/8IEHoRQ%2Bib8SGSHPw\/z0EANyAYAmCrD0BaDaCqDGHqFcEaGgPKDD3aHgMgL\/yiE30GDqBAOwPQJ\/0mH\/1mFZ0WAXwpypxp0901wvE9mQB0X%2BAdz4zvFwEIEZCAy4GmF4D1y0BwVIGZBHD6CfwF3knkj4y8BF1%2BDly4BFxFy8Dly8HkgVw4CV1IBVwpVIHVxv04G1xAF1z7woI4GiCoJz0124IMNIDb2SHsEkCAA%3D\" rel=\"external\">\u0432\u0435\u0441\u044c \u043a\u043e\u0434<\/a> \u0442\u043e\u0436\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043e\u0442 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f. \u041f\u043e\u0431\u0435\u0434\u0430!<\/p>\n<h2>\u0422\u043e\u043d\u043a\u043e\u0441\u0442\u0438<\/h2>\n<p> \u0425\u043e\u0442\u044c \u0432 \u043a\u043e\u0434\u0435 \u0438 <em>\u043d\u0435\u0442 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f<\/em>, \u044f \u043d\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e, \u0447\u0442\u043e \u043e\u043d <em>\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d<\/em> \u2014 \u043c\u043e\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439. \u042f \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u043a\u043e\u0434 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u043c\u0438!<\/p>\n<p> \u041a\u0440\u0438\u0441 \u0423\u044d\u043b\u043b\u043e\u043d\u0441 \u043e\u0442\u043c\u0435\u0447\u0430\u0435\u0442 \u0432 <a href=\"https:\/\/nullprogram.com\/blog\/2017\/10\/06\/\">\u0441\u0432\u043e\u0451\u043c \u043f\u043e\u0441\u0442\u0435 \u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u0435\u0437 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f<\/a>, \u0447\u0442\u043e \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 DFA \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0445\u043e\u0436\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c; SIMD \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u00ab\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u0434\u0430\u0451\u0442 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u00bb, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u0436\u0435 \u043b\u0443\u0447\u0448\u0435. \u042f \u0431\u044b \u043d\u0435 \u0441\u0442\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0441\u0442\u044c \u0432 \u0432\u0430\u0448\u0435\u0439 \u043b\u044e\u0431\u0438\u043c\u043e\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435.<\/p>\n<p> \u0422\u0430\u043a\u0436\u0435 \u044f \u043d\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e, \u0447\u0442\u043e \u043e\u043d \u043f\u043e\u043b\u0435\u0437\u0435\u043d. \u041d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043a\u043e\u0434\u043e\u043c \u043f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e: \u044f \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b \u0435\u0433\u043e \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 MIT. \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u0435\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043d\u0430 Rust, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f <a href=\"https:\/\/cceckman.com\/r\/unicode-branchless\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f<\/h2>\n<p> <\/p>\n<ol>\n<li>\u042f \u0445\u043e\u0442\u0435\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0432\u0441\u044e\u0434\u0443 (total function), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0438\u0441\u043a \u0434\u043b\u0438\u043d\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 0 \u0434\u043e 32.<\/li>\n<li>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0432\u044b\u0448\u0435, \u0442\u043e, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c. \u042f \u0433\u043e\u0432\u043e\u0440\u044e \u043b\u0438\u0448\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e <code>rustc +1.83 -O<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0435\u0433\u043e\u0434\u043d\u044f, \u0443 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430.<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/878068\/\"> https:\/\/habr.com\/ru\/articles\/878068\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/km\/ob\/5t\/kmob5ta2o9y3qtc2qyakr9gpooy.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/km\/ob\/5t\/kmob5ta2o9y3qtc2qyakr9gpooy.jpeg\" data-blurred=\"true\"\/><\/div>\n<p> \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c UTF-8 \u0431\u0435\u0437 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439?<\/p>\n<p> <a href=\"https:\/\/github.com\/cceckman\/unicode-branchless\/blob\/main\/src\/lib.rs\">\u0414\u0430<\/a>.<\/p>\n<h2>\u0412\u043e\u043f\u0440\u043e\u0441<\/h2>\n<p> <a href=\"https:\/\/github.com\/ngoldbaum\">\u041d\u0430\u0442\u0430\u043d \u0413\u043e\u043b\u0434\u0431\u0430\u0443\u043c<\/a> \u0437\u0430\u0434\u0430\u043b \u0432 \u0447\u0430\u0442\u0435 <a href=\"https:\/\/www.recurse.com\/scout\/click?t=8238c6d9149cbd0865752e535795d509\">Recurse<\/a> \u0432\u043e\u043f\u0440\u043e\u0441:<\/p>\n<blockquote><p>\u042f \u0437\u043d\u0430\u044e, \u043a\u0430\u043a \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c UTF-8 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446 \u043f\u043e\u0438\u0441\u043a\u0430 (\u0441\u043c. <a href=\"https:\/\/github.com\/skeeto\/branchless-utf8\">https:\/\/github.com\/skeeto\/branchless-utf8<\/a>), \u043d\u043e \u0435\u0441\u043b\u0438 \u044f \u0445\u043e\u0447\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434\u043e\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443 UTF-8, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u0435\u0437 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439?<\/p>\n<p> \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u0430\u043a-\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430 C, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0431\u0430\u0439\u0442\u043e\u0432 UTF-8 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f? \u0418\u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0438\u0441\u043a\u0430?<\/p><\/blockquote>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-446628","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/446628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=446628"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/446628\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=446628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=446628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=446628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}