Я хочу повернуть байт (очень важно, чтобы это 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)
Хотя довольно просто повернуть байт, это классический пример проблемы 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
}
return byte;
?