Сообщение Re: Алгоритм чтения LSB-bit от 18.12.2024 10:38
Изменено 18.12.2024 10:40 Zhendos
Re: Алгоритм чтения LSB-bit
Здравствуйте, Vladimir, Вы писали:
V>Подскажите алгоритм оптимального чтения LSB num бит.
V>Есть число 11110000 = F0. Необходимо прочитать справа налево num bit, начиная с first.
V>Например: first = 2, num = 5, читаем 00111 = 7.
V>Меня смущает цикл for и оператор if.
Не очень понял смысл цикла, если нужно со 2 по 5 бит, то просто
сдвигаем биты к началу и накладываем маску, что-то типа:
V>Первое что приходит:
Кстати в коде ошибка из-за приоритета операторов,
нужно в скобки обернуть выражение "(value & (1 << i)) ? 1 : 0",
чтобы все правильно считалось.
V>Подскажите алгоритм оптимального чтения LSB num бит.
V>Есть число 11110000 = F0. Необходимо прочитать справа налево num bit, начиная с first.
V>Например: first = 2, num = 5, читаем 00111 = 7.
V>Меня смущает цикл for и оператор if.
Не очень понял смысл цикла, если нужно со 2 по 5 бит, то просто
сдвигаем биты к началу и накладываем маску, что-то типа:
(value >> (first + 1)) & ((1 << (num- 1)) - 1)
V>Первое что приходит:
V>int v = 0;
V>for (int i = first; i < num + first; i++)
V> v = (v << 1) + (value & (1 << i)) ? 1 : 0;
Кстати в коде ошибка из-за приоритета операторов,
нужно в скобки обернуть выражение "(value & (1 << i)) ? 1 : 0",
чтобы все правильно считалось.
Re: Алгоритм чтения LSB-bit
Здравствуйте, Vladimir, Вы писали:
V>Подскажите алгоритм оптимального чтения LSB num бит.
V>Есть число 11110000 = F0. Необходимо прочитать справа налево num bit, начиная с first.
V>Например: first = 2, num = 5, читаем 00111 = 7.
V>Меня смущает цикл for и оператор if.
Не очень понял смысл цикла, если нужно со 2 по 5 бит, то просто
сдвигаем биты к началу и накладываем маску, что-то типа:
V>Первое что приходит:
Кстати в коде ошибка из-за приоритета операторов,
нужно в скобки обернуть выражение "(value & (1 << i)) ? 1 : 0",
чтобы все правильно считалось.
Плюс вполне возможно UB из-за работы с потенциально отрицательными
числами, лучше конечно использовать "unsigned int" в битовой арифметике.
V>Подскажите алгоритм оптимального чтения LSB num бит.
V>Есть число 11110000 = F0. Необходимо прочитать справа налево num bit, начиная с first.
V>Например: first = 2, num = 5, читаем 00111 = 7.
V>Меня смущает цикл for и оператор if.
Не очень понял смысл цикла, если нужно со 2 по 5 бит, то просто
сдвигаем биты к началу и накладываем маску, что-то типа:
(value >> (first + 1)) & ((1 << (num- 1)) - 1)
V>Первое что приходит:
V>int v = 0;
V>for (int i = first; i < num + first; i++)
V> v = (v << 1) + (value & (1 << i)) ? 1 : 0;
Кстати в коде ошибка из-за приоритета операторов,
нужно в скобки обернуть выражение "(value & (1 << i)) ? 1 : 0",
чтобы все правильно считалось.
Плюс вполне возможно UB из-за работы с потенциально отрицательными
числами, лучше конечно использовать "unsigned int" в битовой арифметике.