2012-08-12 120 views
2

sigdelset()函數用於關閉一個位。這裏是它的實現:與sigdelset()函數混淆

int 
    sigdelset(sigset_t *set, int signo) //signo is the signal number 
    { 
    *set &= ~(1 << (signo - 1)); // turn bit off 
    return(0); 
    } 

我不明白這段代碼。我認爲信號編號看起來像0010(二進制)。但它看起來不正確。

回答

2

你混淆人的大腦是如何想象二進制數,以及我們如何在C

首先表示他們,有一個在標準C沒有二進制表示法(但某些編譯器接受0b...作爲擴展名)。

二,1 << (signo - 1)是一個二進制左移運算符。 Signo可能是要關閉的序號,從1開始。然後我們從中減1,因此我們得到一個從0開始的數(邏輯上是第一位)。然後我們左移它獲得2的冪(SIGNO - 1),這是一個數字它的二進制表示是這樣的:

00000010000000... etc. 
    ^
     +- bit #signo - 1 

然後函數使用~(2的補數)運算符,它會導致(與按位和賦值運算符&=一起)關閉該位。

+0

我忽略了'〜' – Nmzzz 2012-08-12 08:35:36

+0

@Nmzzz那麼這個函數很好,只是看到我的答案的其他部分作爲解釋:) – 2012-08-12 08:37:16

+0

非常感謝!我現在可以理解它。 – Nmzzz 2012-08-12 08:39:15