交换一个字节中的位

时间:2012-10-12 01:50:33

标签: c bit-manipulation bit-shift

我正在尝试创建一个函数来改变给定输入字节c1的位,这取决于另一个字节的最低有效位,称为密钥。

如果key的最低有效位为1,则需要根据相应的镜像位位置交换c1的位。

例如,举个例子,

key = 0110 1010,我们只关心1010作为其最低有效位。

c1 = 0010 1011

根据1010,我们需要将第一个位置与第六个位置交换,第三个位置与第四个位置交换为第四个位置。

c1最终应该是0111 0001。

这是我到目前为止所做的:

unsigned char swapBits(unsigned char c1, unsigned char key){
    for(int i = 0; i < 4; i++){
            key = (key >> i);
            if(key & 1){
               /* swap bits here */
            }
    }
    return c1;
}

我将如何实现这一目标?

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

#include <stdint>    // uint8_t
#include <limits.h>  // CHAR_BIT

uint8_t furtle(uint8_t val, uint8_t key) 
{
    uint8_t mask_lo = 0x01;                  // init masks at LS and MS bits
    uint8_t mask_hi = mask_lo << (CHAR_BIT - 1);
    for (int b = 0; b < CHAR_BIT / 2; ++b)
    {
        if (key & mask_lo)                   // if bit b is set in val
        {
            uint8_t b_lo = val & mask_lo;    // get corresponding low/high bits
            uint8_t b_hi = val & mask_hi;    // and swap them
            val = (val & ~mask_lo) | (b_hi >> (CHAR_BIT - b * 2 - 1));
            val = (val & ~mask_hi) | (b_lo << (CHAR_BIT - b * 2 - 1));
        }
        mask_lo <<= 1;                       // shift masks
        mask_hi >>= 1;
    }
    return val;
}

答案 1 :(得分:-2)

您可以将所有位插入数组,然后交换元素。

最后,将所有元素作为输出读取或使用string.concat函数将元素添加到字符串中。