Как найти позицию наименьшего значимого бита (LSB) в int? C ++ - PullRequest
0 голосов
/ 16 января 2020

Я должен написать функцию c ++, которая заменяет n-й и младший значащий бит на int. Я нашел несколько примеров и сделал это:

v1 = v1 ^ ((((v1&1) ^ (v1>>n)&1) << LSBpos) | (((v1&1) ^ (v1>>n)&1) << n));
cout<<v1;

v1 - int. v1 & 1 - это значение LSB. LSBpos должен быть позицией LSB, но я не знаю, как его получить. Есть объяснения того, как получить позицию LSB, которая установлена ​​или очищена, но мне просто нужна эта позиция, независимо от того, установлена ​​она или нет.

1 Ответ

2 голосов
/ 16 января 2020

Вам не нужно знать положение LSB. И это здорово, потому что из-за порядка байтов он может быть в нескольких местах!

Давайте найдем некоторую помощь: Как установить, очистить и переключить один бит? :

Проверка бита

Вы не просили об этом, но я мог бы также добавить это. Чтобы проверить бит, сдвиньте число n вправо, затем поразрядно И это:

bit = (number >> n) & 1U;

Изменение n-го бита на x

Установка n-го бита на 1 или 0 может быть достигнуто с помощью следующего в реализации C ++, дополненной двумя:

number ^= (-x ^ number) & (1UL << n);

и go для него!

int swap_nth_and_lsb(int x, int n)
{
    // let to the reader: check the validity of n

    // read LSB and nth bit
    int const lsb_value = x& 1U;
    int const nth_value = (x>> n) & 1U;

    // swap
    x ^= (-lsb_value) & (1UL << n);
    x ^= /* let to the reader: set the lsb to nth_value */

    return x;
}

В комментарии OP сказано «Я должен написать одну строку кода для получения результата» . Хорошо, если условие в одну строку выполнено, вы можете начать с вышеприведенного решения и постепенно превращать его в однострочное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...