【嵌入式撸码】内存相关的大小尽量偶数对齐
背景
嵌入式系统内存操作最好字节偶数对齐,不然有些平台可能直接崩溃。近日看了赋值代码,就是内存偶数对齐的,所以顺便做个总结记录和分享。
分析
一、代码及解析:
解析操作过程:
1.右移一位 (>> 1):将 iOriginWidth 右移一位,相当于将 iOriginWidth 除以 2,并抛弃最低位的那一位。
2.左移一位 (<< 1):再将右移后的结果左移一位,相当于将其乘以 2。因为之前右移丢弃了最低位的那一位,左移会在低位补0,所以这个操作的结果就是将 iOriginWidth 的最低位清零。
结果:这个操作的结果是将 iOriginWidth 的最低位(即二进制中的最后一位)清零,从而得到一个偶数。如果 iOriginWidth 原本就是偶数,那么 iWidth 会等于 iOriginWidth;如果 iOriginWidth 是奇数,那么 iWidth 会等于 iOriginWidth - 1。
二、区别和优势
区别:
1.直接赋值:如果使用 iWidth = iOriginWidth,iWidth 的值将和 iOriginWidth 完全相同,无论 iOriginWidth 是奇数还是偶数。
2.通过位运算赋值:使用 iWidth = ((iOriginWidth >> 1) << 1),可以确保 iWidth 的值一定是偶数。如果 iOriginWidth 是奇数,那么 iWidth 会变成比 iOriginWidth 小 1 的偶数;如果 iOriginWidth 是偶数,那么 iWidth 保持不变。
优势:
1.确保偶数值:这种位运算可以确保 iWidth 始终是一个偶数值,这在某些场景下可能是必要的,比如图像处理中的宽度要求是偶数,或者内存对齐需要偶数值。
2.性能:位运算通常比取模或其他数学操作要快,因为它直接操作二进制位,是 CPU 指令集支持的原子操作。因此,如果你需要确保一个值是偶数,这种方式可能比 iWidth = iOriginWidth - (iOriginWidth % 2) 更高效。
总结
将 iOriginWidth 通过位运算处理后再赋值给 iWidth 可以确保 iWidth 是偶数,而直接赋值无法做到这一点。这种操作在某些需要偶数值的情况下非常有用,并且相比其他方法更为高效。