簡體   English   中英

C中的位重排/操作

[英]Bit rearrangement/manipulation in C

我想在一個字節中排列位,以產生一定的順序。 例如,如果起始字節如下0 1 1 0 1 0 1 0,其位標記為1 2 3 4 5 6 7 8,我想將其排列為符合以下定位:2 4 3 5 7 1 8 6結果為:1 0 1 1 1 0 0 0.最有效的方法是什么? 我讀到了“查找”表,但我不確定這是如何工作的。 有人可以給出一個例子,並解釋在C中進行這種位重排的有效方法。

您可以創建一個包含256個條目的“unsigned char”數組。 該數組的索引將是要轉換的字節的當前值,該條目的值將是“轉換”值。

或者,您可以使用位掩碼和“if”語句......但效率會降低。

這是“數組”方法的片段......只定義了幾個值......並且沒有輸出“二進制文本”格式的輸出。

#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]);
}

我想我明白了他想要實現的目標。 此代碼可以幫助您:

#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處的原始字節。 position是零或一,然后移動結果中的值,如果是這樣的話。 最后一個for循環僅用於打印結果。 我將您的指數調整為從零開始。

這是改變位位置的一種方法。 使用& (和 - 運算符),我們從char中選擇某些位,然后將它們移到新的位位置。 最后,所有移位的位將通過|愉快地連接在一起 (或運營商)。 左移<<將左右移位>>向右移動。 我冒昧地重新編號位置。 7表示左側最高有效位,0表示最低有效位,因此左右移位操作正確描述了移位方向。

為什么首先是換檔操作然后是最后兩行的AND操作? - 因為char-type可以是無符號的,如果我們對負值進行右移,例如11111000 (-8),則最高有效位將被復制; 11111000 >> 2將導致(1 filled from this end -->) 11111110 (-2)。 (參見右移C中的負數 。)

但回到功能:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM