簡體   English   中英

C位數組宏,誰能解釋我這些如何工作?

[英]C bit array macros, could anyone explain me how these work?

我正在嘗試為學校項目實施erathostenes的篩選,我決定使用位數組來實現。 在我搜索材料時,我遇到了這三個宏,它們完美無缺,但我無法真正閱讀(理解)它們。

#define ISBITSET(x,i) ((x[i>>3] & (1<<(i&7)))!=0)
#define SETBIT(x,i) x[i>>3]|=(1<<(i&7));
#define CLEARBIT(x,i) x[i>>3]&=(1<<(i&7))^0xFF;

能否請你詳細解釋其中至少一個,我對C中的按位操作有基本的了解(基本上我知道它們“存在”)。

這會在另一個使用不同字節序的架構上工作嗎? 提前致謝。

x是字符數組。 i是位的索引。 由於每個char都是8位,因此i的最后3位定義了char中的位,其余位定義了數組中的char。

i>>3右移3位,所以你得到的部分告訴你哪個字符,所以x[i>>3]是包含由i索引的位的字符。

i&7是的最后3個比特i (因為7 10 ==111 2 ),所以它的焦炭中的所述位的索引。 1<<(i&7)是一個char(真正的它是int,但在這個上下文中你可以忽略它的區別),它的位由i開啟,其余位關閉。 (鑽頭的面具)

char&mask是檢查位是否打開的常用方法。

char|=mask是轉入的常用方法。

char&=~mask是關閉位的常用方法,如果mask是char,則~mask==mask^0xFF

我不認為這些宏是依賴於endiannes的。 (如果你通過將int[]轉換為*char得到x ,那就是另一個故事)

首先,那些宏假設CHAR_BIT == 8 ,而i >> 3實際上是i / 8 (所以這個代碼應該說i / CHAR_BIT 。)這個第一個表達式計算包含你想要的位的字節 ,因此是數組x的數組索引(應該是unsigned char的數組!)。

現在我們已經選擇了正確的字節,即x[i >> 3] (或者你自己的更好的代碼中的x[i / CHAR_BIT] ),我們必須進行比特擺弄。 同樣, i & 7真的想成為i % CHAR_BIT ,它只提取你的位數的剩余部分,它給出了字節的偏移量。

例。 請求第44位, i = 43 ,假設CHAR_BIT = 8i / CHAR_BIT為5,所以我們在第六個字節, i % CHAR_BIT是3,所以我們看第六個字節的第四個位。

實際的比特擺弄本身就是常見的東西; 例如,測試給定位以適當的位模式執行逐位AND(即第k位的1 << k ); 設置該位使用逐位OR,並將其歸零需要更多涉及的東西(想一想!)。

#define ISBITSET(x,i) (((x)[(i) / CHAR_BIT] & (1u << ((i) % CHAR_BIT))) != 0)
#define SETBIT(x,i) (x)[(i) / CHAR_BIT] |= (1u << ((i) % CHAR_BIT);
#define CLEARBIT(x,i) (x)[(i) / CHAR_BIT] &= ~(1u << ((i) % CHAR_BIT))
  • 始終在宏參數周​​圍加上括號
  • 總是喜歡無符號類型的位操作
  • (1u << CHAR_BIT)對於8位平台是256
  • 有一個exra ; 在最后一個宏之后

暫無
暫無

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

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