这个按位操作的目的是什么? (mWidth + 0x0000000F)&〜0x0000000F;

问题描述:

这里是代码行我很困惑于:这个按位操作的目的是什么? (mWidth + 0x0000000F)&〜0x0000000F;

mMaskRowBytes = (mWidth + 0x0000000F) & ~0x0000000F; 

〜是NOT运营商吗?

比方说mWidth是960,或11.11亿

所以我们来到这里是

00000000000000000000001111001111 
& 
11111111111111111111111111110000 

这只会导致

00000000000000000000001111000000 

,对吗?

将十进制数转换为二进制数的目的是什么?

操作符〜取补:

因此,例如:0110会成为1001

目的是什么我不知道 - 你需要来说明如何使用mMaskRowBytes。 但它看起来好像是用于处理16位(2字节)块的东西,因此需要确保数据与最接近的2字节地址空间对齐。通常编译器会这样做以确保最有效的堆栈对齐。在32位系统上,这将是4字节和64位4/8字节。这意味着编译器可以有信心通过有效的步骤上下移动堆栈。对于现代操作系统,这一切都由编译器和操作系统来关注。如果你在系统级别失败,那么你可能必须为自己完成这一切。

+0

我在这里使用图像,所以它看起来像内存需要对齐,因为OS X?不是100% –

+0

啊,这可能与填充有关。你正在读/写/格式化图像数据。有些格式需要按行逐行填充某些倍数的东西?如果是这样的话,不要太在意细节。应该有一些图书馆,以节省您的麻烦。 – cdcdcd

'〜'是按位互补运算符

对于正数mWidth,它所做的全部向上舍入到下一个16的倍数。(因为960已经除16,所以保持不变)。

有更清楚的方式做到这一点,虽然具体可以根据您的特定语言。