Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的位重排/操作_C_Bit Manipulation_Byte_Lookup Tables_Bitmask - Fatal编程技术网

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

我想在一个字节中排列位,以产生特定的顺序。例如,如果起始字节如下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 <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在回答中的评论。