我无法理解下面的代码相对于所提供的评论。 这是什么代码做,什么将是等效的码8-aligned
?
/* segment size must be 4-aligned */
attr->options.ssize &= ~3;
在这里, ssize
是unsigned int
类型。
我无法理解下面的代码相对于所提供的评论。 这是什么代码做,什么将是等效的码8-aligned
?
/* segment size must be 4-aligned */
attr->options.ssize &= ~3;
在这里, ssize
是unsigned int
类型。
由于图4中的二进制是100,任何值对准到4字节边界(即4的倍数)将具有设置为零的最后两个比特。
3二进制是11,和〜3是那些位的按位求反,即,... 1111100。 执行位,并用该值将保持每一点相同的,除了最后两个将被清除(位和1位==,和位&0 == 0)。 这为我们提供了下一个较低的或相等值,该值是4的倍数。
要为8(二进制1000)做同样的操作,我们需要清除最低的三个位。 我们可以做到这一点与二进制111的按位取反,即约7。
两(1,2,4,8,16,32 ...)中的所有功率可以通过简单和操作来对准。
这给四舍五入大小:
size &= ~(alignment - 1);
或者,如果你想圆了:
size = (size + alignment-1) & ~(alignment-1);
“对齐-1”,只要它是二的幂的值,就会给你“所有的人”达位仅差两个电源。 ~
反转所有位,所以你得到药粥零和零供的。
您可以检查的东西是二经的动力:
bool power_of_two = !(alignment & (alignment-1))
这样做是因为,例如4:
4 = 00000100
4-1 = 00000011
& --------
0 = 00000000
或16:
16 = 00010000
16-1 = 00001111
& --------
0 = 00000000
如果我们用5来代替:
5 = 00000101
4-1 = 00000100
& --------
4 = 00000100
所以不是2的力量!
也许更容易理解的评论将
/* make segment size 4-aligned
by zeroing two least significant bits,
effectively rounding down */
然后,至少对我来说,迫切的问题啪啪我的脑海:如果真的被舍去,当它的大小? 会不会围捕更合适:
attr->options.ssize = (attr->options.ssize + 3) & ~3;
在其他的答案已经说过,使其8对齐,3位需要被清零,所以用7
,而不是3
。 所以,我们可以使之成为一个功能:
unsigned size_align(unsigned size, unsigned bit_count_to_zero)
{
unsigned bits = (1 << bit_count_to_zero) - 1;
return (size + bits) & ~bits;
}
~3
是位模式...111100
。 当你这样做的位与该模式,它清除底部的两个位,即向下取整为4最接近的倍数。
~7
确实为8对齐同样的事情。
代码确保底部两个比特ssize
被清除,低保ssize
是4等效代码的倍数为8对齐。将
attr->options.ssize &= ~7;
number = number & ~3
数被四舍五入4最接近的倍数比较少 number
例:
if number is 0,1,2 or 3, the `number` is rounded off to 0
类似地if number is 4,5,6,or 7,
数字is rounded off to 4
但如果这是涉及到内存对齐 ,该内存必须向上和向下不对齐。