Какой лучший способ установить немного и почему? - PullRequest
0 голосов
/ 10 ноября 2019

Если бы мне нужно было установить 4-й бит,

Какой самый лучший способ

Метод 1: a | = (1 << 3) </p>

Метод 2: a| = 8

Пожалуйста, уточните разницу.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2019

Эти два значения эквивалентны.

Использование 1 << 3 более ясно для читателя, какой бит вы хотите установить. А поскольку это выражение является константой времени компиляции, компиляторы обычно вычисляют значение во время компиляции, поэтому нет никаких накладных расходов во время выполнения.

0 голосов
/ 10 ноября 2019

Как вы заметили, оба они делают одно и то же. Позвольте мне сосредоточиться на другой части:

  • (1 << 3), взять число 1 (двоичное: 0000 0001) и сместить его на 3 точки влево (двоичное: 0000 1000) </li>
  • 8 возьмите число 8 (двоичное: 0000 1000)

Как видите, результатом будет то же двоичное число: 0000 1000

Если мне нужновыберите между этими двумя, я бы выбрал сдвиг, так как это более очевидно, что вы хотите немного. Однако лично я выбрал бы третий вариант при создании этих чисел: 0b0000'1000

0b обозначает двоичный литерал, доступный с C ++ 14, а ' - это разделитель цифр (такжеC ++ 14), что похоже на пробелы, которые я использовал ранее.

Однако, если честно, я думаю, что вы используете неправильный инструмент для работы, предполагая, что a является целым числом. std::bitset создан для выполнения подобных манипуляций с битами. (Даже доступно в C ++ 98)

#include <bitset>
#include <iostream>

int main(int, char**)
{
    auto a = std::bitset<8>{};
    a.set(3 /*zero based indexing*/);
    std::cout << a.to_string() << std::endl;
    return 0;
}

Вывод программы: 00001000

Код в компиляторе Explorer

Asкак видите, вы можете очень легко установить биты с помощью метода set, как если бы это был любой другой контейнер. См. документацию для получения дополнительной информации.

...