GCC вращаться с переносом

0

Я хочу повернуть байт (очень важно, чтобы это 8 бит). Я знаю, что Windows предоставляет функцию _rotr8 для выполнения этой задачи. Я хочу знать, как это сделать в Linux, потому что я портирую там программу. Я спрашиваю об этом, потому что мне нужно маскировать бит до 0. Пример:

#define set_bit(byte,index,value) value ? \ //masking bit to 0 and one require different operators The index is used like so: 01234567 where each number is one bit
        byte |= _rotr8(0x80, index) : \ //mask bit to 1
        byte &= _rotr8(0x7F, index) //mask bit to 0

Второе задание должно иллюстрировать важность 8-битного переноса (01111111 ror index)

Показать ещё 1 комментарий
Теги:
bit-manipulation

1 ответ

6
Лучший ответ

Хотя довольно просто повернуть байт, это классический пример проблемы XY, так как вам фактически не нужно поворачивать байт, чтобы реализовать свой макрос set_bit. Простейшая и более переносимая реализация:

#define set_bit(byte,index,value) value ? \ 
        byte |= ((uint8_t)0x80 >> index) : \  // mask bit to 1
        byte &= ~((uint8_t)0x80 >> index)     // mask bit to 0

Еще лучше, так как это 2014, а не 1984, сделайте это встроенной функцией, а не макросом:

inline uint8_t set_bit(uint8_t byte, uint8_t index, uint8_t value)
{
    const uint8_t mask = (uint8_t)0x80 >> index;
    return value ?
        byte | mask :   // mask bit to 1
        byte & ~mask;   // mask bit to 0
}
  • 1
    Я никогда не думал об этом решении!
  • 1
    Поскольку функция передается по значению: return byte; ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню