693 判断一个数的二进制是不是01交替出现
【题目】
【方法一】 记录下最后一位,每次右移一下看看最后一位是不是相反。
代码:
结果:
【方法二】 假设串为: 10101010 串右移1位:01010101 异或为: 11111111。
假设串为: 00000101 串右移1位: 00000010 异或为: 00000111。
假设串为: 00001010 串右移1位: 00000101 异或为: 000001111.
当异或结果全为1时,说明原来的串是01交替出现的。
证明: 如果串出现了"00"。(不包括高位的0) 右移一位: "*0" 异或为 : "*0"
如果串出现了"11" 右移一位: "*1" 异或为: "*0"
如果串中出现了"01" 右移一位: "*0" 异或为: "*1"
如果串中出现了"10" 右移一位: "*1" 异或为: "*1"
因此只有当不存在"00"和"11"时,异或结果才不出现0。
最后怎么判断一个二进制串中只有1没有0呢? 11111111 + 1 ------------- 0000000
00000111 + 1 --------------- 00001000
如果a&(a+1)等于0,说明a全是1串。 证明: 如果一个串不全是1,比如1101 加1之后,高位的1不变。为:1110 相与的话得到1100。不为0。
代码:
结果:
|