我被要求在 char 数组(二进制字符串)上使用按位运算符。应该是什么输出:
一)〜111; 输出字符串应该是 000、1000 还是不同的值?
b) 1010(操作员)100;输出是否与 1010 (运算符) 0100 相同,即使带有前导 0 的这些字符串也将始终有效,或者是否有我遗漏的测试用例?
我被要求在 char 数组(二进制字符串)上使用按位运算符。应该是什么输出:
一)〜111; 输出字符串应该是 000、1000 还是不同的值?
b) 1010(操作员)100;输出是否与 1010 (运算符) 0100 相同,即使带有前导 0 的这些字符串也将始终有效,或者是否有我遗漏的测试用例?
~111 = 000
~0111 = 1000
前导零很重要,因为按位运算对每个输入位进行操作。
在任意长度的位串上实现按位运算(包括求反)的一种一致方法是:
因此,例如~111
= ...1000
,其中...1
代表 - 位的无限序列1
。
您可以自己检查该系统是否满足布尔代数的所有常规规则,例如德摩根定律:
~( ~111 | ~1010 ) = ~( ...1000 | ...10101 ) = ~...11101 = 10 = 111 & 1010
~( ~111 & ~1010 ) = ~( ...1000 & ...10101 ) = ~...10000 = 1111 = 111 | 1010
特别是,如果您使用任意长度的位串来表示以 2 为底的整数(即1
= 1、10
= 2、11
= 3 等),那么“负位串”自然对应于负数(例如...1
= ~0
= -1、...10
= ~1
= -2、...101
= ~10
= -3 等)在广义二进制补码表示中。值得注意的是,这种表示满足一般的二进制补码定律,即 ~x = -x - 1。