sigdelset()函数用于关闭单个位。这是它的实现:
int
sigdelset(sigset_t *set, int signo) //signo is the signal number
{
*set &= ~(1 << (signo - 1)); // turn bit off
return(0);
}
我无法理解这段代码。我认为信号编号看起来像0010
(二进制)。但它看来不对。
答案 0 :(得分:2)
你混淆了人类大脑如何想象二进制数以及我们如何在C中表示它们。
首先,标准C中没有二进制表示法(但某些编译器接受0b...
作为扩展名)。
其次,1 << (signo - 1)
是二元左移运算符。 Signo可能是从1开始关闭的位的序号。然后我们从中减去1,因此我们得到一个从0开始的数字(逻辑上是第一位)。然后我们将它移位以获得2的幂(signo - 1),这是二进制表示的一部分:
00000010000000... etc.
^
+- bit #signo - 1
然后该函数使用~
(2的补码)运算符,这将导致(与按位和赋值运算符&=
一起)关闭该位。