<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Llemilio: заметки с тегом c++</title>
<link>https://llemilio.ru/tags/c/</link>
<description>Баги моего времени</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.4 (v4171e)</generator>

<itunes:subtitle>Баги моего времени</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>Функции C++ определяющие битовый характер числа</title>
<guid isPermaLink="false">4</guid>
<link>https://llemilio.ru/all/funkcii-opredelyayuschie-bitovy-harakter-chisla/</link>
<pubDate>Mon, 27 May 2019 12:04:21 +0300</pubDate>
<author></author>
<comments>https://llemilio.ru/all/funkcii-opredelyayuschie-bitovy-harakter-chisla/</comments>
<description>
&lt;p&gt;Проверка на то, что в «1» установлен только один бит&lt;br /&gt;
&lt;br&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;// 000001000 - true
// 000001010 - false
// 000000000 - false
template&amp;lt; typename T &amp;gt; // работает только для целых чисел
bool only_one_bit_set_to_one (T bits)
{
    return bits &amp;amp;&amp;amp; !(bits &amp;amp; (bits-1));
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Обратите внимание, что операторы «&amp;&amp;» и «!» логические, а не битовые!&lt;br /&gt;
&lt;br&gt;&lt;br /&gt;
Проверка на то что установлен только один бит и его порядковый номер от 0 до sizeof(T)-1&lt;br /&gt;
&lt;br&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;template&amp;lt; typename T &amp;gt;
int findSetBit(T bits)
{
    if (!(bits &amp;amp;&amp;amp; !(bits &amp;amp; (bits-1))))
        return -1;
    return log2(bits);
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br&gt;&lt;br /&gt;
Компилятор GNU (GCC) имеет в своем арсенале стандартную функцию для определения числа установленных битов&lt;br /&gt;
&lt;br&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;#include &amp;lt;iostream&amp;gt;

int main()
{
   std::cout &amp;lt;&amp;lt; __builtin_popcount (4) &amp;lt;&amp;lt; std::endl;
   std::cout &amp;lt;&amp;lt; __builtin_popcount (3) &amp;lt;&amp;lt; std::endl;

   return 0;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br&gt;&lt;br /&gt;
Начиная с С++11 можно использовать тип &lt;a href="http://www.cplusplus.com/reference/bitset/bitset/"&gt;bitset&lt;/a&gt; в котором реализованы функции any(), none(), count() etc&lt;br /&gt;
&lt;br&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;#include &amp;lt;iostream&amp;gt;       // std::cin, std::cout
#include &amp;lt;bitset&amp;gt;         // std::bitset

int main ()
{
  std::bitset&amp;lt;16&amp;gt; foo;

  std::cout &amp;lt;&amp;lt; &amp;quot;Please, enter a binary number: &amp;quot;;
  std::cin &amp;gt;&amp;gt; foo;

  if (foo.any())
    std::cout &amp;lt;&amp;lt; foo &amp;lt;&amp;lt; &amp;quot; has &amp;quot; &amp;lt;&amp;lt; foo.count() &amp;lt;&amp;lt; &amp;quot; bits set.\n&amp;quot;;
  else
    std::cout &amp;lt;&amp;lt; foo &amp;lt;&amp;lt; &amp;quot; has no bits set.\n&amp;quot;;

  return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
</item>


</channel>
</rss>