均先转为二进制,然后对两个二进制数进行位运算。

位与&:两位均为1时得1,否则得0

位或|:任一位为1得1,否则得0

位异或^:双目运算符,位不同时得1,相同时得0。位取反^(某些语言中为~):单目运算符,0得1、1得0。运算结果中负数的绝对值比正数大1,即^a = b,则a + b = -1。注意,在Golang中,^即可以是位异或运算符,也可以是位取反运算符,单目时是位取反,双目时是位异或。

左移运算<<:符号位固定,低位补0

技巧:左移一位相当于乘2,右移一位相当于除2(但1右移1位后为0)。

例如,进程退出状态信息为2字节16个位,高8位是退出状态码,低8位中的低7位是导致进程退出的信号(如果是信号导致子进程退出的话),最高位是coredump的flag(即表示这个退出的进程是否进行了coredump)。即:

假设该退出状态信息保存在变量exit_info中。

如果想取出退出状态码部分,由于它在高位最边缘,所以右移位最方便:

如果想取出信号部分,由于在中间的7个位上,用这些位的全1二进制做与运算最方面,与运算时,只有信号某位上为1时,与的结果才为1,这样就取出了信号为上的全部1信息位:

同理,如果想取出coredump flag,则与128位与即可:

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 骏马金龙!