2

我被要求在 char 数组(二进制字符串)上使用按位运算符。应该是什么输出:

一)〜111; 输出字符串应该是 000、1000 还是不同的值?

b) 1010(操作员)100;输出是否与 1010 (运算符) 0100 相同,即使带有前导 0 的这些字符串也将始终有效,或者是否有我遗漏的测试用例?

4

2 回答 2

3

~111 = 000

~0111 = 1000

前导零很重要,因为按位运算对每个输入位进行操作。

于 2013-08-19T12:28:53.427 回答
1

在任意长度的位串上实现按位运算(包括求反)的一种一致方法是:

  1. 假设所有“正常”位串在它们前面隐含着无限数量的前导零位,并且
  2. 扩展您正在使用的位串的空间,还包括前面有无限个1位的“负”位串。

因此,例如~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。

于 2014-03-02T00:31:11.393 回答