StringBuilder内部方法中& ~1位运算符语法含义解析
StringBuilder中
& ~1位运算符的含义解析 先看原方法的代码实现:
private int GetReplaceBufferCapacity(int requiredCapacity) { // 该方法假设所需容量小于StringBuilder的最大容量 Diagnostics.Debug.Assert(requiredCapacity <= m_MaxCapacity); int newCapacity = Capacity; // 将当前容量向上取整到大于所需容量的最近2的倍数 if (newCapacity < requiredCapacity) { newCapacity = (requiredCapacity + 1) & ~1; } return newCapacity; }
& ~1的具体含义
拆解来看:
~1(按位取反):以32位整数为例,1的二进制是00000000 00000000 00000000 00000001,按位取反后会变成11111111 11111111 11111111 11111110——也就是除最低位为0,其余所有位都是1的数值。&(按位与):当一个数值和上述取反结果做按位与时,会把该数值的最低二进制位强制置为0,最终得到一个偶数(偶数的二进制最低位始终是0)。
结合代码里的(requiredCapacity + 1) & ~1,整体作用是把requiredCapacity向上取整到不小于它的最小2的倍数,举几个实际例子:
- 若
requiredCapacity是5(奇数):5+1=6,6 & ~1结果为6,是不小于5的最小2的倍数; - 若
requiredCapacity是6(偶数):6+1=7,7 & ~1结果为6,刚好等于自身(本身就是2的倍数); - 若
requiredCapacity是7(奇数):7+1=8,8 & ~1结果为8,是不小于7的最小2的倍数。
补充说明
根据微软官方对C#位运算符的定义:
- 按位取反运算符
~会反转操作数的每一位; - 按位与运算符
&仅当两个操作数的对应位都为1时,结果的该位才为1,否则为0。
这也是& ~1能实现“转偶数”逻辑的底层依据。
内容的提问来源于stack exchange,提问作者Humble Newbie
相关产品推荐
相关产品推荐

