我被要求在char数组(二进制字符串)上使用按位运算符。 输出应该是什么:
a)~111;输出字符串应该是000,1000还是其他什么?
b)1010(操作员)100;输出与1010(运算符)0100相同,即使使用前导0这些字符串也一直有效,或者是否存在我缺少的测试用例?
答案 0 :(得分:3)
~111 = 000
~0111 = 1000
前导零是很重要的,因为按位运算对每个输入位进行操作。
答案 1 :(得分:1)
在任意长度位串上实现按位运算(包括否定)的一种一致方法是:
因此,例如~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。