有人可以解释一下这个明智的操作吗
Can someone explain this bit wise operation
我想了解这个用于设置 char 数组大小的按位运算中发生了什么,但我并不完全理解它。
unsigned long maxParams = 2;// or some other value, I just chose 2 arbitrarily
unsigned char m_uParamBitArray[(((maxParams) + ((8)-1)) & ~((8)-1))/8];
根据 maxParams 的值将此数组设置为多大?
当maxParams
不能被八整除时,公式第一部分四舍五入为下一个八的倍数;否则,它保持数字不变。公式的第二部分将结果除以八,它总是可以这样做而不会得到余数。
一般情况下,如果想四舍五入到N
而不超过,可以在除法前加上N-1
:
(x + (N - 1)) / N
您可以安全地删除表达式的 & ~((8)-1)
部分:
(maxParams + (8-1))/8
这会计算适合 maxParams
位所需的 8 位字符数。
+7
是四舍五入到下一个8的倍数。
0 -> 7 将舍入为 0 字符
1 -> 8 将舍入为 1 个字符
除以 8 之后。/8
按位and是在除以8之前丢弃最后三位。
我想了解这个用于设置 char 数组大小的按位运算中发生了什么,但我并不完全理解它。
unsigned long maxParams = 2;// or some other value, I just chose 2 arbitrarily
unsigned char m_uParamBitArray[(((maxParams) + ((8)-1)) & ~((8)-1))/8];
根据 maxParams 的值将此数组设置为多大?
当maxParams
不能被八整除时,公式第一部分四舍五入为下一个八的倍数;否则,它保持数字不变。公式的第二部分将结果除以八,它总是可以这样做而不会得到余数。
一般情况下,如果想四舍五入到N
而不超过,可以在除法前加上N-1
:
(x + (N - 1)) / N
您可以安全地删除表达式的 & ~((8)-1)
部分:
(maxParams + (8-1))/8
这会计算适合 maxParams
位所需的 8 位字符数。
+7
是四舍五入到下一个8的倍数。
0 -> 7 将舍入为 0 字符
1 -> 8 将舍入为 1 个字符
除以 8 之后。/8
按位and是在除以8之前丢弃最后三位。