精华内容
下载资源
问答
  • 二进制移位实现加减乘除
    千次阅读
    2018-08-02 17:29:47

    如何使用位操作分别实现整数的加减乘除四种运算?

    2. 解决方案

    需要熟练掌握一些常见功能的位操作实现,具体为:

    <1> 常用的等式:-n = ~(n-1) = ~n+1

    <2> 获取整数n的二进制中最后一个1:n&(-n) 或者 n&~(n-1),如:n=010100,则-n=101100,n&(-n)=000100

    <3> 去掉整数n的二进制中最后一个1:n&(n-1),如:n=010100,n-1=010011,n&(n-1)=010000

    (1) 加法实现

    可以很容易地用“异或”和“或”操作实现整数加法运算:对应位数的“异或操作”可得到该位的数值,对应位的“与操作”可得到该位产生的高位进位,如:a=010010,b=100111,计算步骤如下:

    第一轮:a^b=110101,(a&b)<<1=000100, 由于进位(000100)大于0,则进入下一轮计算,a=110101,b=000100,a^b=110001,(a&b)<<1=001000,由于进位大于0,则进入下一轮计算:a=110001,b=001000,a^b=111001,(a&b)<<1=0,进位为0,终止,计算结果为:111001。

    代码如下:

     

    intadd(inta, intb) {

      intcarry, add;

      do{

        add = a ^ b;

        carry = (a & b) << 1;

        a = add;

        b = carry;

      }while(carry != 0);

      returnadd;

    }

     

     

     

    (2) 减法实现

    减法可很容易地转化为加法:a - b = a + (-b) = a + (~b + 1 )

    代码如下:

     

    intsubtract(inta, intb) {

      returnadd(a, add(~b, 1));

    }

     

     

     

    (3) 乘法实现

    先看一个实例:1011*1010:

     

    1011

       * 1010

     ----------

        10110 < 左移一位,乘以0010

    + 1011000 < 左移3位,乘以1000

    ----------

      1101110

     

    因而乘法可以通过系列移位和加法完成。最后一个1可通过b&~(b-1)求得,可通过b& (b-1)去掉,为了高效地得到左移的位数,可提前计算一个map,代码如下:

     

     

    intmultiply(inta, intb) {

      boolneg = (b < 0);

      if(b < 0)

        b = -b;

      intsum = 0;

      map<int,int> bit_map;

      for(inti = 0; i < 32; i++)

        bit_map.insert(pair<int,int>(1 << i, i));

        while(b > 0) {

          intlast_bit = bit_map[b & ~(b - 1)];

          sum += (a << last_bit);

          b &= b - 1;

        }

      if(neg)

        sum = -sum;

      returnsum;

    }

     

     

    (4) 除法实现

    乘法可很容易转化为减法操作,主要思想与乘法实现类似,代码如下:

     

    intdivide(inta, intb) {

      boolneg = (a > 0) ^ (b > 0);

      if(a < 0)

        a = -a;

      if(b < 0)

        b = -b;

      if(a < b)

        return0;

      intmsb = 0;

      for(msb = 0; msb < 32; msb++) {

        if((b << msb) >= a)

          break;

      }

      intq = 0;

      for(inti = msb; i >= 0; i--) {

        if((b << i) > a)

          continue;

        q |= (1 << i);

        a -= (b << i);

      }

      if(neg)

        return-q;

      returnq;

    }

    更多相关内容
  • 二进制移位运算

    2022-05-01 10:54:58
    移位运算符可以在二进制的基础上对数字进行平移。按照平移的方向和填充数字。 左移:将目标数转换为二进制,把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。 语法: 目标数 << 移位数 ...

    移位运算符是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。按照平移的方向和填充数字。

    左移:将目标数转换为二进制,把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

    语法: 目标数 << 移位数

    例如:28——>0001 1100(28)——0011 1000(56)

    数学意义:在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。

    右移:将目标数转换为二进制,把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补0,负数补1。

    语法: 目标数 >> 移位数

    例如: 14——>0000 1110(14) ——0000 0111(7)

    -14——>1111 0010(-14)—— 1111 1001(-7)

    数学意义:右移一位相当于除2,右移n位相当于除以2的n次方。(注意:如果目标数奇数,则取结果的商,忽略余数部分。)

     

    展开全文
  • /** * 将二进制数转为十进制 * @Author anyao * @DateTime 2020-03-31T18:59:12+0800 * @param {[jq selector]} doms [css选择器] * @param {[string]} actclass [激活的class名] ...
    /**
     * 将二进制数转为十进制
     * @Author   an
     * @DateTime 2020-03-31T18:59:12+0800
     * @param    {[jq selector]}                 doms     [css选择器]
     * @param    {[string]}                 actclass [激活的class名]
     */
    function setZYNum(doms, actclass) {
        const aa = Array.from($(doms), function(item) { return $(item).hasClass(actclass) ? 1 : 0 });
        let num = 0;
        for (let [index, item] of aa.entries()) {
            num += (item << (aa.length - 1 - index))
        }
        return num;
    }
    /**
     * 将十进制转为二进制
     * @Author   an
     * @DateTime 2020-03-31T19:01:11+0800
     * @param    {[jq selector]}                 doms [css选择器]
     * @param    {[number]}                 num  [十进制数]
     * @return   {[array]}                      [二进制数组]
     */
    function analysisZYNum(doms, num) {
        let numArr = Number(num).toString(2).split("");
        let myNumArr = [...'0'.repeat($(doms).length - numArr.length), ...numArr];
        return myNumArr;
    }

    场景示例:

     上面选中为 0 0 1 1 0 0

    代码示例:

    展开全文
  • 利用python进行二进制、十进制、十六进制相互转换和二进制移位操作1 二进制与十进制相互转换2 十六进制与十进制相互转换3 二进制与十六进制的相互转换4 高位补零5 二进制移位 1 二进制与十进制相互转换 通过python...

    1 二进制与十进制相互转换

    通过python自带int()函数将二进制转换成十进制数,二进制数在python中一般都是str字符串格式。

    通过python自带函数bin()将十进制数转换成二进制数,生成的二进制数为str字符串格式,且会自动带上’0b’二进制标识符。

    a2 = '01011110'
    a10 = int(a2, 2)
    a2_ = bin(a10)
    print(a10)
    print(a2_)
    运行结果:
    94
    0b1011110
    

    2 十六进制与十进制相互转换

    通过python自带int()函数将十六进制转换成十进制数,十六进制数在python中一般也都是str字符串格式。

    通过python自带函数hex()将十进制数转换成十六进制数,生成的十六进制数为str字符串格式,且会自动带上’0x’十六进制标识符。

    a16 = '1c'
    a10 = int(a16, 16)
    a16_ = hex(a10)
    print(a10)
    print(a16_)
    运行结果:
    28
    0x1c
    

    3 二进制与十六进制的相互转换

    二进制与十六进制直接的相互转换需要组合使用函数int()、bin()和hex()。

    a16 = '1c'
    a2 = bin(int(a16, 16))
    print(a2)
    运行结果:
    0b11100
    

    得到的二进制数是没有自动补零的。由于我们一般尝尝采用8个字节的二进制形式,且方便进行移位操作,我们需要高位补零。

    4 高位补零

    字符串函数zfill()用于给str字符串补零,用法如下

    a = '11100'
    b = a.zfill(8)  #补成8个字节
    print(b)
    运行结果:
    00011100
    

    但是,由于bin()函数自动生成的二进制数都会带上‘0b’标识符,直接采用zfill( )函数会在‘ob’的前面补零,这会导致该二进制数错误。我们采用如下办法先移除‘0b’,再进行补零操作。

    a = '0b11100'
    b = a[2:].zfill(8)  #去掉0b,取'11100',再补零
    print(b)
    运行结果:
    00011100
    

    5 二进制移位

    因为在报文中经常会采用第一位的后几个字节与第二位的前几个字节组合表示一个数,所以需要用到移位操作。例如,如图所示的报文,行表示位数,列表示字节数,一位有八个字节。该报文中,绿色的信息表示横向距离,其由第2位的低位6个字节与第3位的高位4个字节组合得到。
    在这里插入图片描述
    假设现在第2位的数据为’0x1c’,将其转换为二进制为’00011100’,正好8个字节。假设第3位的数据为’0xa3’,将其转换为二进制为’10100011’。要求横向距离,首先将第2位的后6个字节取出来,并向左移4位。然后,将第3位的前4个字节取出来,并向右移位4位。于是有横向距离=‘0111000000’+‘1010’那么,横向距离即为’0111001010’ 。

    a = '0x1c'
    b = '0xa3'
    a1 = int(bin(int(a, 16))[2:].zfill(8)[-6:], 2) << 4  #第2位的后6个字节
    a2 = int(b, 16) >> 4  #第3位的前4个字节
    c = a1 + a2
    print(c)
    d = '0111001010'
    print(int(d, 2))
    运行结果:
    458
    458
    

    <<为python的向左移位操作符,>>为python的向右移位操作符。移位操作符的左边是int型十进制数,右边是要移动的字节数。该操作符将十进制数自动转换成二进制数,进行移位,移位后又自动将二进制数转换成十进制数返回。

    展开全文
  • 二进制移位对偶码的构造
  • 电子政务-基于二进制移位编码的光电式位置检测装置.zip
  • 通过二进制移位键控调制数据
  • 主要为大家详细介绍了python实现整数的二进制循环移位,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Python 二进制移位操作学习总结

    万次阅读 2018-08-18 15:16:51
     二进制向左移位操作符: 移位前的数值+"&lt;&lt;"+移位次数 说明: 移位数值的二进制末尾添加0,移位几次就添加几个0 实例: print bin(4) # 结果:0b100 print bin(8) # 结果:0b1000 # ...
  • 二进制移位、补码

    2019-07-11 18:00:31
    针对存储在计算机中中二进制的操作,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。 先说明补码: 说明下-5怎么用二进制表示就明白补码的问题了: 5转化为二进制是101,八位的话为:00000101 然后...
  • 二进制移位详解

    千次阅读 2013-03-24 10:34:21
    首选我先说下什么是2进制、和16进制 2进制:2进1,通过1和0两个数字来表示一个整形数字 16进制:16进1,通过0、2、3、4、5、6、7、8、9、a、b、c、d、e、f来表示一个数字 2进制里如何表示0-10这个数字呢 2进制:...
  • 主要介绍了java基于移位操作实现二进制处理的方法,结合实例形式分析了java针对二进制移位操作处理技巧,需要的朋友可以参考下
  • 二进制差分相移键控在MATLAB和SystemView上的仿真分析.pdf
  • 其中 q 称尾数,是一个有限的二进制数,满足1/2<=q<1 ;整数 n 称阶码。 在以32位表示单精度实数的计算机中,尾数用24位表示,阶码8位; 在以48位表示单精度实数的计算机中,尾数用40位表示,阶码8位; 而...
  • 整数二进制移位运算

    千次阅读 2019-03-23 14:51:38
    正整数右移时,左边高位补0 负整数右移时,左边高位补1,负数是以补码形式存储
  • 计算机中二进制移位运算

    万次阅读 2019-02-21 14:04:19
    移位运算符: 高位左移后溢出,舍弃: ...∫将一个运算对象的各二进制位,全部左移若干位(左边的二进制丢弃,右边补0)  例如:左移1位 &gt;&gt;:有符号右移 右移是将一个二进制操作数对象按指定...
  • matlab里二进制数的移位运算的函数intersect:集合交集ismember :是否集合中元素setdiff :集合差集setxor :集合异或(不在交集中的元素)union :两个集合的并unique :返回向量作为一个集合所有元素(去掉相同元素)dec2...
  • 获取数字 num 二进制形式第 bit 位的值。注意: 1、bit 从 1 开始 2、返回 0 或 1 3、举例:2 的二进制为 10,第 1 位为 0,第 2 位为 1 示例1 输入 128, 8 输出 1 1.移位运算符>>和& ...
  • c#二进制位移的应用

    2021-12-13 11:35:14
    需求:ABC三个物体,动态闪动。count=3 思路,index,结合for循环 1<<i位 int count = 3;//length public float duration = 0.2f;//T int pow = (int)Math.Pow(2.0, count);... (int)(Time.time / duration) : 0
  • 二进制整数都是以补码的形式出现的 正数的原码、反码、补码都相同 负数的反码就是正数的原码先把最高位变为1然后其余的位取反 负数的补码就是该负数的反码加1。
  • //表示a转换成二进制输出格式的位数 void cal(int p) { int i; for (i=len-1;i&gt;=0;i--) { if (p&amp;(1&lt;&lt;i)) cout&lt;&lt;1; else cout&lt;&lt;0; ...
  • PS:n虽然是整型,但当对n使用移位运算符时,编译器是将n看成一个二进制数,再移位的,移位后返回int型结果,也就是说,对十进制数使用移位运算符包含两次隐式转换,第一次是将n变成二进制数,第二次是将移位后的n变...
  • 二进制移位运算

    2016-09-29 11:54:16
    java的移位运算有三种:左移&lt;&lt;,有符号右移&gt;&gt;,无符号右移&gt;&gt;&gt;   对于左移&lt;&lt;,不管正负数,操作数右边的低位以0补齐,相当于乘以2的n次方,n为...
  • 源码 原码就是符号位加上真值的绝对值, 即用第一位表示... 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111] 即 [-127 , 127] 反码 正数的反码是其本身 负数的反码
  • 对于正数的二进制,应该没有疑问,比如(以8位系统来分析,第一位为符号位)1的二进制表示为00000001。 而对于负数来说,就比较麻烦,比如-1。有人说是10000001,而有人说是11111111。 其实这两种说法都没错,这...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,259
精华内容 24,503
关键字:

二进制怎么移位