gcc随身携带旋转

时间:2014-11-30 21:55:50

标签: c++ c bit-manipulation

我想旋转一个字节(非常重要的是它的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 个答案:

答案 0 :(得分:6)

虽然旋转字节相当简单,但这是XY problem的典型示例,因为实际上 根本不需要来旋转一个字节才能实现你的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
}