在limits.h的檔案中,它指出:
程式需要知道整數型別中有多少位的一個常見原因是使用 unsigned long int 陣列作為位向量。您可以通過以下方式訪問索引 n 處的位:
vector[n / ULONG_WIDTH] & (1UL << (n % ULONG_WIDTH))
但是如果vector
是我們需要的無符號長n <= ULONG_WIDTH
,這意味著那里的除法總是會導致0。vector
應該被定義為unsigned long
s陣列或其他東西?
uj5u.com熱心網友回復:
向量是一個無符號長整數,我們需要 n <= ULONG_WIDTH
Vector 是一個無符號長陣列。
n
不受 ULONG_WIDTH 限制。n
是陣列中所有元素的所有位中的位位置。如果您將所有向量元素中的所有位一個接一個地布置,那么位在所有位中的位置。n
|----------vector[0]----------->|----------vector[1]----------->|----------vector[2]----------->
abcde......................................................................x....................
^LSB MSB^ etc.
x
如果我數數正確,標記的位的位置為 n = 2 * 32 12 = 76。要訪問它,您必須訪問向量的第 2 個元素的第 12 位。注意:我從 0 開始索引,第一位的位置是 0,第一個向量元素是元素編號 0。
n / ULONG_WIDTH
計算第二個向量元素。
n % ULONG_WIDTH
計算第 2 個向量元素內的第 12 位位置。
(1UL << (n % ULONG_WIDTH))
是設定了第 12 位的掩碼0b00.....1
。
vector[n / ULONG_WIDTH] & (1UL << (n % ULONG_WIDTH))
如果向量[2] 中設定了第 12 位,則回傳第 12 位設定,否則回傳 0。
通常以相同的方式:
vector[n / ULONG_WIDTH] |= (1UL << (n % ULONG_WIDTH))
設定位,
vector[n / ULONG_WIDTH] &= ~(1UL << (n % ULONG_WIDTH))
清除位,
vector[n / ULONG_WIDTH] ^= (1UL << (n % ULONG_WIDTH))
切換位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/487151.html