2012-07-16 65 views
1

我想了解以下功能,決定一個位是上:在C位移位是我的位?

int isBitISet(char ch, int i) 
{ 
    char mask = 1 << i ; 
    return mask & ch ; 
} 

首先,爲什麼會一個char?對於ch=abcdefghi=5該函數假設返回右邊第五位(?),d。所以mask=00000001<<5=0010000000100000 & abcdefgh = 00c00000

請你解釋一下我們如何得到字符,我們可以在沒有任何鑄造的情況下完成所有這些轉換?爲什麼我們沒有得到第五位,爲什麼返回的值真的是指示位是否打開?

編輯:'abcdefg'只是位的符號,我並不是想要在char類型中表示一個字符串。

我曾經認爲char爲'a'而不是實際的8位,所以這可能是我第一個問題的答案。

+1

我想你誤解的東西...在C'char'爲8位,並且只能有0和255之間的值。 (用於無符號)或-128至127(用於簽名)。一個'char'永遠不會有'abcdefgh'這樣的值。也許你正在考慮'char *'和字符串?在這種情況下,你不能使用位掩碼。 – 2012-07-16 08:28:12

+0

'abcdefg'只是這些位的符號,我不是故意以字符類型發送字符串。 – Numerator 2012-07-16 08:29:49

+0

'h'被認爲是第0位,c是第5位。代碼是絕對好的。 – 2012-07-16 08:29:56

回答

2

它不會給你第五位。二進制數字開始於2 ,所以第一位實際上是用0索引的,而不是1。它會給你返回第六位。

實例:

ch & (1 << 0); // first bit 
ch & (1 << 1); // second bit 
ch & ((1 << 3) | (1 << 2)); // third and fourth bit. 

此外,char是隻有一個號碼的解釋。在大多數機器上,它的大小爲8位,您可以將其解釋爲無符號值(0至255)或有符號值(-128至127)。所以基本上它是一個範圍非常有限的整數,因此您可以在不投射的情況下應用位移。

此外,當且僅當給定位未設置時,函數纔會返回等於零的整數值。否則它是一個非零值。

1

該函數可能會返回一個字符,因爲它所處理的輸入也只是一個字符。你當然不能傳遞ch = abcdefgh,因爲那將是一串8個字符。

+0

'abcdefg'只是位的符號,我不是故意要發送char類型的字符串 – Numerator 2012-07-16 08:30:24

1

你可以在字符上進行切換,因爲C允許這樣做。 char只是一個8位整數類型,所以不需要禁止它。

你是正確的事實,即isBitISet(abcdefgh, 5)返回00c00000如果字母A,B等都是數字的二進制表示的位。 返回值不是the fifth bit from the right,它與輸入中的數字相同,但是除了第五位之外的所有位均爲零。 您還必須記住,位的編號從零開始,所以第五位是c是正確的,就像第零位是h一樣。

本示例使用整數類型來表示布爾值。這在C99之前的C代碼中很常見,因爲C沒有bool類型。 如果您將您的返回值視爲布爾值,請記住非零的所有內容均爲true,且零爲false。因此,如果設置了位i,則C的輸出爲isBitISet,否則爲false。

1

現在你應該知道,在計算機中,一切都以0開始。也就是說,第5位實際上是第六位(不是第五位)。

你的分析實際上是正確的,如果你給它abcdefgh5,你會得到00c00000

當你做「和」:

return mask & ch; 

因爲mask具有類型intch也將被自動轉換爲int(相同的方式,多家運營商)。這就是爲什麼你不需要明確投射。

最後,這個函數的結果是0..0z0..0的形式。如果z,您檢查的位是0,則只要涉及if,此值爲0即爲false。如果它不是零,那麼if就是這樣。

0
  1. 首先,該函數不會返回第i位,但會告訴您該位是否打開或關閉。

  2. char mask的使用依賴於此。只需定義一個8位掩碼,因爲應用此掩碼的值爲char

  3. 爲什麼當1是字符時需要投射? i僅爲< <運算符的值。

  4. ch=abcdefgh作爲輸入沒有意義。 ch是char,所以ch只能是一個字符。

  5. 工作如下:首先構造一個掩碼,將所有不需要的位清零。例如,如果輸入是ch = 204ch = 11001100),並且我們想知道第6位是否打開,那麼i = 5。因此mask = 1 << 5 = 00100000。然後通過AND操作將該掩碼應用於該值。除了所討論的那個位之外,這將使所有的東西都爲零:11001100 & 00100000 = 00000000 = 0。由於C中的0爲假,則第6位未設置。關於ch輸入和i = 6的另一個示例:mask = 1 << 6 = 01000000; 11001100 & 01000000 = 01000000 = 64,它不是0,因此爲真,所以設置了第7位。

+0

'1'是'char'?並且在C中基本上沒有在'char'中完成的操作,如果C中操作符的所有參數都比它小,則它們被提升爲'int'。 – 2012-07-16 09:46:43

+0

那麼1是一個字符,爲什麼不呢? ASCII碼1.我看不出有什麼問題。 – m0skit0 2012-07-16 09:55:01

0

務必:

return 0 != (mask & ch) ; 

如果你想要一個布爾(00000000或00000001)的回報。單獨的mask & ch會在正確的位置給你一些問題。

(也有人說不是句話之後B約我= 5是第六位以上)

+1

@ m0skit0,C有'_Bool'類型和自C99以來指向它的宏'bool',這已經有13年了。醒來! – 2012-07-16 09:41:00