我将首先解释“补整数值不包括前导零二进制位”的含义(从现在开始,我将其称为非前导零位补码或 NLZ 补码)。
例如有整数92,二进制数是1011100。如果我们执行正常的按位非或补码,结果是:-93(有符号整数)或11111111111111111111111110100011(二进制)。那是因为前导零位也被补充了。
因此,对于 NLZ-Complement,前导零位不被补码,那么 92 或 1011100 的 NLZ-complementing 的结果是:35 或 100011(二进制)。该操作是通过将输入值与非前导零值的 1 位序列进行异或运算来执行的。插图:
92: 1011100
1111111 (xor)
--------
0100011 => 35
我做了这样的java算法:
public static int nonLeadingZeroComplement(int n) {
if (n == 0) {
return ~n;
}
if (n == 1) {
return 0;
}
//This line is to find how much the non-leading zero (NLZ) bits count.
//This operation is same like: ceil(log2(n))
int binaryBitsCount = Integer.SIZE - Integer.numberOfLeadingZeros(n - 1);
//We use the NLZ bits count to generate sequence of 1 bits as much as the NLZ bits count as complementer
//by using shift left trick that equivalent to: 2 raised to power of binaryBitsCount.
//1L is one value with Long literal that used here because there is possibility binaryBitsCount is 32
//(if the input is -1 for example), thus it will produce 2^32 result whom value can't be contained in
//java signed int type.
int oneBitsSequence = (int)((1L << binaryBitsCount) - 1);
//XORing the input value with the sequence of 1 bits
return n ^ oneBitsSequence;
}
我需要一个建议如何优化上述算法,尤其是生成 1 位补码序列(oneBitsSequence)的行,或者是否有人可以提出更好的算法?
更新:我也想知道这个非前导零补码的已知术语?