gcc随身携带旋转

nim*_*son 0 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
Run Code Online (Sandbox Code Playgroud)

第二项任务应说明8位进位旋转的重要性 (01111111 ror index)

Pau*_*l R 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
Run Code Online (Sandbox Code Playgroud)

更好的是,因为这是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
}
Run Code Online (Sandbox Code Playgroud)