![](/img/trans.png)
[英]Can anyone explain me how to return a two dimensonal array in C from a function?
[英]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 = 8
, i / 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))
;
在最后一個宏之后
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.