Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 243

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.6. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ findBook() Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π½Π΅ использовала ΠΊΠΎΡ€Ρ‚Π΅ΠΆ ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Ρƒ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.7. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅, ΠΊΠ°ΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ findBook() Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.8. Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли Π² качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° accumulate() Π² послСднСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π° этого Ρ€Π°Π·Π΄Π΅Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Sales_data?

17.2. Π’ΠΈΠΏ bitset

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.8 ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ встроСнныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ цСлочислСнный ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ ΠΊΠ°ΠΊ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ Π±ΠΈΡ‚ΠΎΠ². Для облСгчСния использования Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ обСспСчСния возмоТности Ρ€Π°Π±ΠΎΡ‚Ρ‹ с коллСкциями Π±ΠΈΡ‚ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС самого Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ цСлочислСнного Ρ‚ΠΈΠΏΠ°, стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° опрСдСляСт класс bitset (Π½Π°Π±ΠΎΡ€ Π±ΠΈΡ‚ΠΎΠ²). Класс bitset ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ bitset.

17.2.1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ инициализация Π½Π°Π±ΠΎΡ€ΠΎΠ² Π±ΠΈΡ‚ΠΎΠ²

Бписок конструкторов Ρ‚ΠΈΠΏΠ° bitset ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² Ρ‚Π°Π±Π». 17.2. Π’ΠΈΠΏ bitset β€” это шаблон класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ классу array, ΠΈΠΌΠ΅Π΅Ρ‚ фиксированный Ρ€Π°Π·ΠΌΠ΅Ρ€ (см. Ρ€Π°Π·Π΄Π΅Π» 3.3.6). ΠŸΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ² слСдуСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках количСство Π±ΠΈΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ:

bitset<32> bitvec(1U); // 32 Π±ΠΈΡ‚Π°; младший Π±ΠΈΡ‚ 1, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ 0

Π Π°Π·ΠΌΠ΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ константным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ (см. Ρ€Π°Π·Π΄Π΅Π» 2.4.4). Π­Ρ‚ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ опрСдСляСт Π½Π°Π±ΠΎΡ€ Π±ΠΈΡ‚ΠΎΠ² bitvec, содСрТащий 32 Π±ΠΈΡ‚Π°. Подобно элСмСнтам Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, Π±ΠΈΡ‚Ρ‹ Π² Π½Π°Π±ΠΎΡ€Π΅ Π±ΠΈΡ‚ΠΎΠ² Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΈΠΌΠ΅Π½. Доступ ΠΊ Π½ΠΈΠΌ осущСствляСтся ΠΏΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. НумСрация Π±ΠΈΡ‚ΠΎΠ² начинаСтся с 0. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π±ΠΈΡ‚Ρ‹ Π½Π°Π±ΠΎΡ€Π° bitvec ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Ρ‹ ΠΎΡ‚ 0 Π΄ΠΎ 31. Π‘ΠΈΡ‚Ρ‹, располоТСнныС Π±Π»ΠΈΠΆΠ΅ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ (ΠΊ 0), Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ младшими Π±ΠΈΡ‚Π°ΠΌΠΈ (low-order), Π° Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ (ΠΊ 31) β€” ΡΡ‚Π°Ρ€ΡˆΠΈΠΌΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ (high-order).


Π’Π°Π±Π»ΠΈΡ†Π° 17.2. Бпособы ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ²

bitset<n> b; Набор b содСрТит n Π±ΠΈΡ‚ΠΎΠ², ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0. Π­Ρ‚ΠΎ конструктор constexpr (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.6) bitset<n> b(u); Набор b содСрТит копию n ΠΌΠ»Π°Π΄ΡˆΠΈΡ… Π±ΠΈΡ‚ΠΎΠ² значСния u Ρ‚ΠΈΠΏΠ° unsigned long long. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ n большС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚ΠΈΠΏΠ° unsigned long long, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° Π½ΡƒΠ»ΡŒ. Π­Ρ‚ΠΎ конструктор constexpr (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.6) bitset<n> b(s, Ρ€os, m, zero, one); Набор b содСрТит копию m символов ΠΈΠ· строки s, начиная с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ pos. Π‘Ρ‚Ρ€ΠΎΠΊΠ° s ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ символы для Π½ΡƒΠ»Π΅ΠΉ ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†; Ссли строка s содСрТит любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ символ, пСрСдаСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ invalid_argument. Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ хранятся Π² Π½Π°Π±ΠΎΡ€Π΅ b ΠΊΠ°ΠΊ Π½ΡƒΠ»ΠΈ ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ соотвСтствСнно. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ pos ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ m β€” string::npos, zero β€” '0' ΠΈ one β€” '1' bitset<n> b(cp, pos, m, zero, one); ПодобСн ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ конструктору, Π½ΠΎ копируСтся ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ массив, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ cp. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ m Π½Π΅ прСдоставлСно, cp Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° строку Π² стилС Π‘. Если m прСдоставлСно, Ρ‚ΠΎ начиная с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ cp Π² массивС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ m символов, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… нулям ΠΈΠ»ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌ ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ строку ΠΈΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ явными (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.4). Π’ Π½ΠΎΠ²ΠΎΠΌ стандартС Π±Ρ‹Π»Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ символы для 0 ΠΈ 1. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ² Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ

ΠŸΡ€ΠΈ использовании для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ² цСлочислСнного значСния ΠΎΠ½ΠΎ прСобразуСтся Π² Ρ‚ΠΈΠΏ unsigned long long ΠΈ рассматриваСтся ΠΊΠ°ΠΊ битовая схСма. Π‘ΠΈΡ‚Ρ‹ Π² Π½Π°Π±ΠΎΡ€Π΅ Π±ΠΈΡ‚ΠΎΠ² ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΏΠΈΠ΅ΠΉ этой схСмы. Если Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ² прСвосходит количСство Π±ΠΈΡ‚ΠΎΠ² Π² Ρ‚ΠΈΠΏΠ΅ unsigned long long, Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π½ΡƒΠ»ΡŒ. Если Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ² мСньшС количСства Π±ΠΈΡ‚ΠΎΠ², Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ младшиС Π±ΠΈΡ‚Ρ‹ прСдоставлСнного значСния, Π° ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ Π²Π½Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ² ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ:

// bitvec1 мСньшС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°; ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

// ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ

bitset<13> bitvec1(0xbeef); // Π±ΠΈΡ‚Ρ‹ 1111011101111

// bitvec2 большС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°; ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ bitvec2

// ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π½ΡƒΠ»ΡŒ

bitset<20> bitvec2(0xbeef); // Π±ΠΈΡ‚Ρ‹ 00001011111011101111

// Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… с 64-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ long long, 0ULL - это 64 Π±ΠΈΡ‚Π° ΠΈΠ· 0,

// a ~0ULL - 64 Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹

bitset<128> bitvec3(~0ULL); // Π±ΠΈΡ‚Ρ‹ 0...63 - Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹; 63...121 - Π½ΡƒΠ»ΠΈ

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ² ΠΈΠ· строки

Набор Π±ΠΈΡ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· строки ΠΈΠ»ΠΈ указатСля Π½Π° элСмСнт Π² символьном массивС. Π’ любом случаС символы нСпосрСдствСнно ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ схСму. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΡ€ΠΈ использовании строки для прСдставлСния числа символы с самыми Π½ΠΈΠ·ΠΊΠΈΠΌΠΈ индСксами Π² строкС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΡ‚Π°Ρ€ΡˆΠΈΠΌ Π±ΠΈΡ‚Π°ΠΌ, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚:

bitset<32> bitvec4("1100"); // Π±ΠΈΡ‚Ρ‹ 2 ΠΈ 3 - Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ - 0

Если строка содСрТит мСньшС символов, Ρ‡Π΅ΠΌ Π±ΠΈΡ‚ΠΎΠ² Π² Π½Π°Π±ΠΎΡ€Π΅, ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π½ΡƒΠ»ΡŒ.

БоглашСния ΠΏΠΎ индСксации строк ΠΈ Π½Π°Π±ΠΎΡ€ΠΎΠ² Π±ΠΈΡ‚ΠΎΠ² прямо ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹: символ строки с самым высоким индСксом (ΠΊΡ€Π°ΠΉΠ½ΠΈΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ символ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ младшСго Π±ΠΈΡ‚Π° Π² Π½Π°Π±ΠΎΡ€Π΅ Π±ΠΈΡ‚ΠΎΠ² (Π±ΠΈΡ‚ с индСксом 0). ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ² ΠΈΠ· строки слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎΠ± этом Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΈ.

ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всю строку Π² качСствС исходного значСния для Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ², Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ строки:

string str("1111111000000011001101");

bitset<32> bitvec5(str, 5, 4); // Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π±ΠΈΡ‚Π°, начиная с str[5] - 1100

bitset<32> bitvec6(str, str.size()-4); // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ послСдних

                                       // символа

Π—Π΄Π΅ΡΡŒ Π½Π°Π±ΠΎΡ€ Π±ΠΈΡ‚ΠΎΠ² bitvec5 инициализируСтся подстрокой str, начиная с символа str[5], ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ символами Π΄Π°Π»Π΅Π΅. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΊΡ€Π°ΠΉΠ½ΠΈΠΉ справа символ подстроки прСдставляСт Π±ΠΈΡ‚ самого Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ порядка. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π°Π±ΠΎΡ€ bitvec5 инициализируСтся Π±ΠΈΡ‚Π°ΠΌΠΈ с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 3 Π΄ΠΎ 0 ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1100, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ β€” 0. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ² bitvec6 ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ строку ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ, поэтому ΠΎΠ½ инициализируСтся символами строки str, начиная с Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠ³ΠΎ ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки str. ΠžΡΡ‚Π°Ρ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ² Π½Π°Π±ΠΎΡ€Π° bitvec6 инициализируСтся нулями. Π­Ρ‚ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 17.2.1

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.9. ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ схСму, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ содСрТит ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² bitset:

(a) bitset<64> bitvec(32);

(b) bitset<32> bv(1010101);

(c) string bstr; cin >> bstr; bitset<8> bv(bstr);

17.2.2. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π±ΠΈΡ‚ΠΎΠ²

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π±ΠΈΡ‚ΠΎΠ² (Ρ‚Π°Π±Π». 17.3) ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ установки ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±ΠΈΡ‚ΠΎΠ². Класс bitset ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΈΡΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.8. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ bitset эти ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ смысл, Ρ‡Ρ‚ΠΎ ΠΈ Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ встроСнныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ для Ρ‚ΠΈΠΏΠ° unsigned.


Π’Π°Π±Π»ΠΈΡ†Π° 17.3. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π±ΠΈΡ‚ΠΎΠ²

b.any() УстановлСн Π»ΠΈ Π² Π½Π°Π±ΠΎΡ€Π΅ b Ρ…ΠΎΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π±ΠΈΡ‚? b.all() ВсС Π»ΠΈ Π±ΠΈΡ‚Ρ‹ Π½Π°Π±ΠΎΡ€Π° b установлСны? b.none() НСт Π»ΠΈ Π² Π½Π°Π±ΠΎΡ€Π΅ b установлСнных Π±ΠΈΡ‚ΠΎΠ²? b.count() ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ установлСнных Π±ΠΈΡ‚ΠΎΠ² Π² Π½Π°Π±ΠΎΡ€Π΅ b b.size() Ѐункция constexpr (см. Ρ€Π°Π·Π΄Π΅Π» 2.4.4), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ количСство Π±ΠΈΡ‚ΠΎΠ² Π½Π°Π±ΠΎΡ€Π° b b.test(pos) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли Π±ΠΈΡ‚ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ pos установлСн, ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС b.set(pos, v) b.set() УстанавливаСт для Π±ΠΈΡ‚Π° Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ pos логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ v. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ v ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true. Π‘Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² устанавливаСт всС Π±ΠΈΡ‚Ρ‹ Π½Π°Π±ΠΎΡ€Π° b b.reset(pos) b.reset() БбрасываСт Π±ΠΈΡ‚ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ pos ΠΈΠ»ΠΈ всС Π±ΠΈΡ‚Ρ‹ Π½Π°Π±ΠΎΡ€Π° b b.flip(pos) b.flip() Π˜Π·ΠΌΠ΅Π½ΡΠ΅Ρ‚ состояниС Π±ΠΈΡ‚Π° Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ pos ΠΈΠ»ΠΈ всС Π±ΠΈΡ‚Ρ‹ Π½Π°Π±ΠΎΡ€Π° b b[pos] ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ доступ ΠΊ Π±ΠΈΡ‚Ρƒ Π½Π°Π±ΠΎΡ€Π° b Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ pos; Ссли Π½Π°Π±ΠΎΡ€ b константСн ΠΈ Π±ΠΈΡ‚ установлСн, Ρ‚ΠΎ b[pos] Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Π° Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false b.to_ulong() b.to_ullong() Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° unsigned long ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΠ° unsigned long long с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Π±ΠΈΡ‚Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ Π² Π½Π°Π±ΠΎΡ€Π΅ b. Если битовая схСма Π² Π½Π°Π±ΠΎΡ€Π΅ b Π½Π΅ соотвСтствуСт ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, пСрСдаСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ overflow_error b.to_string(zero, one) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ схСму Π½Π°Π±ΠΎΡ€Π° b. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ zero ΠΈ one ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ значСния '0' ΠΈ '1'. Они ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для прСдставлСния Π±ΠΈΡ‚ΠΎΠ² 0 ΠΈ 1 Π² Π½Π°Π±ΠΎΡ€Π΅ b os << b Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π² ΠΏΠΎΡ‚ΠΎΠΊ os Π±ΠΈΡ‚Ρ‹ Π½Π°Π±ΠΎΡ€Π° b ΠΊΠ°ΠΊ символы '0' ΠΈ '1' is >> b Π§ΠΈΡ‚Π°Π΅Ρ‚ символы ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° is Π² Π½Π°Π±ΠΎΡ€ b. Π§Ρ‚Π΅Π½ΠΈΠ΅ прСкращаСтся, ΠΊΠΎΠ³Π΄Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ символ отличаСтся ΠΎΡ‚ 1 ΠΈΠ»ΠΈ 0 Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ b.size() Π±ΠΈΡ‚ΠΎΠ²

НСкоторыС ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, count(), size(), all(), any() ΠΈ none(), Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ состоянии всСго Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ². Π”Ρ€ΡƒΠ³ΠΈΠ΅, set(), reset() ΠΈ flip(), ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ состояниС Π½Π°Π±ΠΎΡ€Π° Π±ΠΈΡ‚ΠΎΠ². Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ Π½Π°Π±ΠΎΡ€ Π±ΠΈΡ‚ΠΎΠ², Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ. Π’ любом случаС вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² примСняСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠΎ всСму Π½Π°Π±ΠΎΡ€Ρƒ, Π° вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π±ΠΈΡ‚Ρƒ: