C程序的操作员和~31

时间:2014-03-01 16:46:27

标签: c

我想从这段代码询问C运算符。我的朋友们问,但我从未见过这个运营商:

binfo_out.biSizeImage = ( ( ( (binfo_out.biWidth * binfo_out.biBitCount) + 31) & ~31) / 8) * abs(out_bi.biHeight);

此运算符& ~31的含义是什么?任何人都能解释一下吗?

5 个答案:

答案 0 :(得分:4)

&运算符是按位AND。 ~运算符是按位NOT(即反转位)。由于31是二进制11111,所以~31是二进制1111111....111100000(即一个数字全部为1,但最后有五个零)。因此用一个数字来清除最不重要的五位,(如果你考虑的话)会向下舍入到32的倍数。

整件事情做什么?请注意,它首先添加31。这样做的结果是整个事物将UP向下舍入到下一个32的倍数。

这可能用于计算(例如),如果您只能使用32位数量来存储它们,将使用多少位来存储它们,因为在最后32位中会有一些浪费号。

答案 1 :(得分:3)

二进制表示中的<31>将是11111,因此~31 = 5个零,前面是1的0000。所以最后5位为零。即掩盖最后5位 这里〜是NOT运算符,即它给出1的补码。和&amp;是AND运算符。

答案 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)

  

&安培; 〜31

表示bitwise and左侧操作数的&bitwise not的{​​{1}}。

http://en.wikipedia.org/wiki/Bitwise_operation

答案 4 :(得分:0)

二进制数字31是11111~在这种情况下是一个人的赞美运算符。所以假设4字节int

~31 = 11111111 11111111 11111111 11100000

&是按位AND运算符。所以你的价值是:

((out_bi.biWidth * out_bi.biBitCount) + 31)

使用上述值执行按位AND,这实际上消隐了左侧结果的5个低位。