我正在尝试创建一个函数来改变给定输入字节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;
}
我将如何实现这一目标?
任何帮助表示感谢。
答案 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函数将元素添加到字符串中。