C语言中的位重排/操作
我想在一个字节中排列位,以产生特定的顺序。例如,如果起始字节如下0 1 1 0 1 0 0 1 0,位标记为1 2 3 4 5 6 7 8,我想对其进行排列,使其与以下位置匹配:2 4 3 5 7 1 8 6此结果为:1 0 1 0 0 0。最有效的方法是什么?我读过有关查找表的内容,但我不确定这是如何工作的。有人能举个例子,解释一下C语言中进行位重排的有效方法吗?我想我理解他想要实现的目标。此代码可能会帮助您:C语言中的位重排/操作,c,bit-manipulation,byte,lookup-tables,bitmask,C,Bit Manipulation,Byte,Lookup Tables,Bitmask,我想在一个字节中排列位,以产生特定的顺序。例如,如果起始字节如下0 1 1 0 1 0 0 1 0,位标记为1 2 3 4 5 6 7 8,我想对其进行排列,使其与以下位置匹配:2 4 3 5 7 1 8 6此结果为:1 0 1 0 0 0。最有效的方法是什么?我读过有关查找表的内容,但我不确定这是如何工作的。有人能举个例子,解释一下C语言中进行位重排的有效方法吗?我想我理解他想要实现的目标。此代码可能会帮助您: #include <stdio.h> #include <std
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint8_t original = 0b01101010;
uint8_t positions[8] = {1,3,2,4,6,0,7,5};
uint8_t result = 0;
for(int i = 0; i < 8; i++)
{
if(original & (1 << (7 - positions[i])))
result |= (1 << (7-i));
}
return 0;
}
我做的第一件事是创建一个字节,它表示原始值以及要更改的位置数组。下一步是在xth处查看原始字节。位置为0或1,然后移动结果中的值(如果是)。最后一个for循环仅用于打印结果。
我把你的指数调整为零 您可以创建一个包含256个条目的无符号字符数组。该数组中的索引将是要转换的字节的当前值,该条目处的值将是转换后的值 或者,您可以使用位屏蔽,如果语句。。。但这会降低效率 下面是数组方法的一个片段。。。只定义了几个值。。。 ... 并且没有以二进制文本格式输出的输出
#include<stdio.h>
unsigned char lkup[256] =
{ 0x00, /* idx: 0 (0x00) */
0x02, /* idx: 1 (0x01) (0b00000001) */
0x08, /* idx: 2 (0x02) (0b00000010) */
0x0a, /* idx: 3 (0x03) (0b00000011) */
0x01 /* idx: 4 (0x04) (0b00000100) */
};
int main(int argc, char **argv)
{
unsigned char wk = 3;
printf("Input: %u output: >%u\n", wk, lkup[wk]);
}
下面是更改位位置的一种方法。使用&和运算符,我们从字符中选择某些位,然后将它们移动到新的位位置。最后,所有移位位将通过|或运算符愉快地连接在一起。 左移到右。我可以自由地重新编号位的位置。7表示左边的最高有效位,0表示最低有效位,因此左右移位操作正确描述移位方向 为什么先有移位操作,然后是最后两行的And操作? –因为字符类型可以是无符号的,如果我们对负值进行右移,例如11111 000-8,最高有效位将被复制;11111000>>2将导致从该端填充1->11111110-2。 看 但回到功能上来:
char changebitpositions (char ch) {
// bit locations (- = don't care)
// before after
return (ch & 0x20) // --5----- => --5----- (no change)
| ((ch & 0x49) << 1) // -6--3--0 => 6--3--0-
| ((ch & 0x12) << 2) // ---4--1- => -4--1---
| ((ch >> 5) & 0x04) // 7------- => -----7--
| ((ch >> 2) & 0x01); // -----2-- => -------2
// original and result: 76543210 => 64531702
}
你能更准确地说明你想改变什么以及如何改变吗?关于你的例子,我不太清楚你想要实现什么。例如,4。原始字节中的位是0,但结果字节中的位是1…我编辑了我的答案。基本上字节的形式是12345678,我想把位重新排列成246456。我原来的第4位是0,应该改为第5位,也就是1,因为在2 4 3 5 7 1 8 6中,第5位现在是第4位。在任何情况下,我认为在1字节级别内不可能做到这一点有时抽象掉细节会使事情变得更难。仍然不知道被问到了什么。@silentboy他想得到原始比特集的特定排列谢谢你的回答。我有点困惑,一旦你得到一个位的转换值,你会对其余的位做什么?在这个例子中,lkup[wk]是转换字节的新值。。。。因此,没有剩余的位。。。本例要求您为字节的256个可能值中的每一个确定转换后的字节。这种方法提供了最快的对话。。。上面的ckruczek的答案不会强迫您执行位交换来得到答案,但是它可能会慢一些,尽管可能不会慢很多。但是,由于这可能是一项作业,让您执行计算可能是一个很好的练习。我喜欢这种方式,只是不了解查找表是如何工作的。对不起,我是个新手。ie:为什么选择这些值作为表格?谢谢!这种方法比查找表更有效吗?我只是参考@TonyB在回答中的评论。