• 陇南农业网
  • 您的位置:首页 >> 国内新闻 >> 正文

    剑指Offer对答如流系列 - 二进制中 1 的个数

    发表时间:2020-03-08 信息来源:www.birdsay.com 浏览次数:1889

     

    文章目录面对问题14:二进制1中的1的数量,主题描述2,问题分析和解决方案(1)想法1 (2)想法23,计数位操作的SAO操作4,位操作的高阶操作(1)加法(2)减法(3)乘法(4)除法

    面对问题14:二进制1中的1的数量,主题描述

    请实现一个函数,输入一个整数,并以数字的二进制表示形式输出1的数量。例如,9表示为1001二进制,2位表示1。所以如果你输入9,函数输出2。

    2。问题分析和解决

    此问题属于《剑指Offer》位操作章节。在二进制相关问题的情况下,很容易想到位操作。虽然类型不多(与、或、异或、左移、右移),但它们总是在变化。稍后我会告诉你一些技巧。让我们先来看看这个问题。

    (1)思路一

    “与”运算有一个性质:通过一个相应位为1、其余位为0的数的“与”运算,可以指定整数一位的值。

    在这个问题中,首先将整数n和1相加,以确定最低位是否为1;如果是1,计数器加1;否则,没有计数器。

    然后向左移动1位(移位运算总是比乘法和除法快),用N做“与”运算,判断下一个低阶是否是1.反复向左移动,然后判断每个位置,从而得到数字1。这种方法需要32个判断周期。(int类型4字节,1字节8位)

    这是最容易想到的方法。

    当然,你可能会想为什么不把整数n移到右边呢?这是因为对于负数,最高位是1,当向右移动时,负数的性质将得到保证,也就是说,最高位仍然是1,稳定的向右移动流和稳定的1流,这是一个死循环。

    (2)思路2

    AND还有另一个性质:从一个整数中减去1,然后加到原来的整数上,会把整数最右边的1变成0。

    写和画,非常好的证明。

    循环利用和操作可以从1变为0。计算1

    3的数字。计数位的SAO操作

    (1)移位操作(左移位或右移位)比乘法和除法快

    如果乘法和除法只对2执行,强烈建议使用这种方法。

    (2)从一个整数中减去1,然后加到原来的整数上,会将整数最右边的1变成0

    。上面的问题表明

    也可以用来判断一个数是否是2的幂。N(n-1)是0,这意味着这个数是2的幂(3),通过右移判断二进制位是0还是1。上面的思想使用了这个思想,但是它是通过左移1来实现的,并且思想保持不变。

    (4)在判断二进制的奇数和偶数时,最后一位是0→偶数,最后一位是1→奇数。

    N1=0-偶数

    N1=1-奇数

    (5)两个相同数字的异或结果是0,一个数字与0的异或结果本身是

    如果给你一组整数数据,其中一个数据只出现一次,另外两次,让你找出只出现一次的数字。直接一个for循环,所有值异或,结果是只出现一次的数字。

    (6)交换两个数字

    高压格,我相信你会在源代码中看到一些帧

    (7)在没有判断语句的情况下,整数

    正和负的绝对值通用:I (I31) I3

    负特殊:I-1 1

    相信我会遇到这种看帧的源代码。

    4,bit操作高阶操作

    上面已经很乐意使用了。你想遇到一个专门设计用来检查位置计算的大型工厂的人脸测试纸吗?

    不要使用-*/来加、减、乘和除

    (1)加法

    对于位操作,有一些基本的属性你需要知道

    (1)二进制位异或操作相当于相应位的加法。不考虑进位(2)二进制位和运算等价于进位(3)在相应位相加后两个数的相加:相应二进制位相加结果的进位结果实现如下:

    递归的书写方法将更清晰。

    (2)减法

    本质上是通过加法来完成的,但是只加一个负数。

    首先,我们必须颠倒被减数(a是负~ a1,补数是已知的)

    (3)乘法

    本质上也是通过加法来实现的,比如6 *乘法

    但是我们需要更多考虑的是正负处理

    然后把它加起来。

    然而,如果仅仅通过加法,当数字相对较大时,感觉就太慢了。

    考虑我们现实生活中手工计算产品的过程。这种方法也适用于二进制。让我以13*14为例来演示如何手动计算乘数与被乘数绝对值的乘积。

    step与decimal

    implementation类似,因此

    (4)除法

    除法运算可以很容易地转换成减法运算,即被除数不断地减少,直到被除数小于除数,此时减少的次数就是我们需要的商,此时的被除数就是余数。

    这里需要注意的是标志的确定。商的符号与乘法中乘积的符号相同,即取决于除数和被除数。相同的符号是证明,不同的符号是否定的。剩余部分与股息符号相同。

    实现类似于乘法的第一个想法,但是效率很低。

    为了提高效率,实现乘法的第二种方法是使用纵列形式。这只是第二个想法

  • 热门标签

  • 日期归档

  • 友情链接:

    陇南农业网 版权所有© www.birdsay.com 技术支持:陇南农业网 | 网站地图