0

我正在尝试创建一个函数,该函数根据另一个字节的最低有效位(称为密钥)更改给定输入字节 c1 的位。

如果 key 的最低位有任何 1,则 c1 的位需要根据其对应的镜像位位置进行交换。

例如,让我们说,

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

c1 = 0010 1011

根据 1010,我们需要在 c1 中将第 1 位与第 6 位、第 3 位与第 4 位互换。

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;
}

我将如何实现这一目标?

任何帮助表示赞赏。

4

2 回答 2

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;
}
于 2012-10-12T02:19:15.103 回答
-2

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

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

于 2012-10-12T01:54:15.763 回答