我想从这段代码询问C运算符。我的朋友们问,但我从未见过这个运营商:
binfo_out.biSizeImage = ( ( ( (binfo_out.biWidth * binfo_out.biBitCount) + 31) & ~31) / 8) * abs(out_bi.biHeight);
此运算符& ~31
的含义是什么?任何人都能解释一下吗?
答案 0 :(得分:4)
&
运算符是按位AND。 ~
运算符是按位NOT(即反转位)。由于31是二进制11111
,所以~31是二进制1111111....111100000
(即一个数字全部为1,但最后有五个零)。因此用一个数字来清除最不重要的五位,(如果你考虑的话)会向下舍入到32的倍数。
整件事情做什么?请注意,它首先添加31。这样做的结果是整个事物将UP向下舍入到下一个32的倍数。
这可能用于计算(例如),如果您只能使用32位数量来存储它们,将使用多少位来存储它们,因为在最后32位中会有一些浪费号。
答案 1 :(得分:3)
答案 2 :(得分:2)
&
是bitwise AND operator。 和两侧的两个操作数的每个对应位。在一个示例中,它执行以下操作:
让char
成为8位的类型。
unsigned char a = 5;
unsigned char b = 12;
它们的位表示如下:
a --> 0 0 0 0 0 1 0 1 // 5
b --> 0 0 0 0 1 1 0 0 // 12
这些的按位AND将是:
a & b --> 0 0 0 0 0 1 0 0 // 8
现在,~
是bitwise NOT operator,它否定了它前缀的操作数的每一位。在一个示例中,它执行以下操作:
与前一个示例中的a
相同,~a
将为:
~a --> 1 1 1 1 1 0 1 0 // 250
现在掌握了所有这些知识,x & ~31
将是x
和~31
的按位AND,其中~31
的位代表如下所示:
~31 --> 1111 1111 1111 1111 1111 1111 1110 0000 // -32 on my end
因此结果将是x
对其位的任何内容,而不是其最后5位。
答案 3 :(得分:0)
答案 4 :(得分:0)
二进制数字31是11111
,~
在这种情况下是一个人的赞美运算符。所以假设4字节int
:
~31 = 11111111 11111111 11111111 11100000
&
是按位AND运算符。所以你的价值是:
((out_bi.biWidth * out_bi.biBitCount) + 31)
使用上述值执行按位AND,这实际上消隐了左侧结果的5个低位。