提供给大家三种方法,三种解题思路;
方法三 优于 方法二 优于 方法一
-
方法一
我们很容易想到一种方法来依次得到这个数的最后一位,当时是以十进制的形式来实现的,在这类比在二进制上似乎同样适用,我们来试一试。
在十进制中我们是这样实现的,123 % 10 = 3 123 / 10 = 12
......
分别可以得到末尾的数字,我们类似的用二进制,就是/2 , %2 分别实现。
主函数
函数实现
我们运行结果发现,似乎有些小问题只有输入无符号整数时满足
要想有符号整数也适用,我们可以转化其,用无符号来接受
比如-1的补码是111111111
用无符号来接受,原码也就是11111111;
我们实验一下
成功,思路比较简单
-
方法二
第二种方法与第一种方法有相似之处,既然我们学习了>>和<<操作符,那么得到最后一位的数字,就可以用输入数字右移相应的位数在&1
如果这一位是0,那么得到的就是0;
如果这一位是1,那么得到的就是1;
借助for循环我们可以轻松实现
-
方法三
第三种方法我们不容易想到
n=n&(n-1)
接下来我们充分理解这个式子
假设n=15,即为1111
1111 & 1110 = 1110
1110 & 1101 = 1100
1100 & 1011 = 1000
1000 & 0111 = 0000
如上,我们发现执行几次,就能将最右边几位1变成0
函数实现
非常巧妙的实现了我们的目的
这来自一道谷歌的笔试题,让我们对简单的算法也有了更深的理解