某些情况下的按位操作说明

时间:2013-08-19 12:17:51

标签: string algorithm bitwise-operators

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

a)~111;输出字符串应该是000,1000还是其他什么?

b)1010(操作员)100;输出与1010(运算符)0100相同,即使使用前导0这些字符串也一直有效,或者是否存在我缺少的测试用例?

2 个答案:

答案 0 :(得分:3)

~111 = 000

~0111 = 1000

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

答案 1 :(得分:1)

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

  1. 假设所有“正常”位串隐含地在它们前面有无限数量的前导零位,并且
  2. 扩展您正在使用的位串的空间,还包括在其前面具有无限数量的一个位的“负”位串。
  3. 因此,例如~111 = ...1000,其中...1代表1 - 位的无限序列。

    您可以自行检查此系统是否满足布尔代数的所有常规规则,例如De Morgan's laws

    ~( ~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,{{1} } = ...101 = -3,等等)在广义two's complement表示中。值得注意的是,这种表示满足一般的二进制补码定律~x = -x - 1。