代码之家  ›  专栏  ›  技术社区  ›  James Raitsev

如何使用位运算符执行乘法?

  •  22
  • James Raitsev  · 技术社区  · 14 年前

    我正在解决一个我能解决的问题,除了最后一个问题——我不确定如何使用位运算符进行乘法:

    0*8 = 0
    
    1*8 = 8
    
    2*8 = 16 
    
    3*8 = 24 
    
    4*8 = 32
    

    你能推荐一种解决这个问题的方法吗?

    7 回复  |  直到 5 年前
        1
  •  36
  •   dsk    5 年前

    将2的任何值乘以n的幂(即2^n),将位n次向左移动。

    0000 0001 = 1 
    
    times 4 = (2^2 => N = 2) = 2 bit shift : 0000 0100 = 4
    
    times 8 = (2^3 -> N = 3) = 3 bit shift : 0010 0000 = 32
    

    等。。

    将位右移。

    位是1或0的整数-不能移动一个位的一部分,因此如果您要乘以的数字不是n的整数值的因数 IE.

    since: 17 = 16  + 1 
    thus:  17 = 2^4 + 1
    
    therefore: x * 17 = (x * 16) + x in other words 17 x's  
    

    因此,要乘以17,您必须向左移动4位,然后再次添加原始数字:

    ==> x * 17 = (x * 2^4) + x 
    ==> x * 17 = (x shifted to left by 4 bits) + x 
    
    so let x = 3 = 0000 0011 
    
    times 16 = (2^4 => N = 4) = 4 bit shift : 0011 0000 = 48
    
    plus the x (0000 0011)
    

    IE.

        0011 0000  (48)  
    +   0000 0011   (3)
    =============
        0011 0011  (51)
    

    编辑:更新到原始答案。 Charles Petzold has written a fantastic book 'Code' 这将以最简单的方式解释所有这些。我完全推荐这个。

        2
  •  10
  •   Ivan Ferić    11 年前

    在没有乘法指令的情况下使两个二进制编码的数相乘。 迭代添加以到达产品是很简单的。

    unsigned int mult(x, y)
    unsigned int x, y;
    {
        unsigned int reg = 0;
    
        while(y--)
            reg += x;
        return reg;
    }
    

    利用位运算,可以充分利用数据编码的特点。 如前所述,位移与乘2相同。 使用这个加法器可以使用两个幂。

    // multiply two numbers with bit operations
    
    unsigned int mult(x, y)
    unsigned int x, y;
    {
        unsigned int reg = 0;
    
        while (y != 0)
        {
            if (y & 1)
            {
                reg += x;
            }
            x <<= 1;
            y >>= 1;
        }
        return reg;
    }
    
        3
  •  3
  •   Jeff Ogata    14 年前

    我认为这应该是左移。8是2^3,所以左移3位:

    2<<3=8

        4
  •  3
  •   epic_fil    14 年前

    你将被乘数乘以2的幂。
    3*17=3*(16+1)=3*16+3*1 …=0011B<<4+0011B

        5
  •  3
  •   Algorithmatic MariusSiuram    9 年前
    public static int multi(int x, int y){
            boolean neg = false;
            if(x < 0 && y >= 0){
                x = -x;
                neg = true;
            }
            else if(y < 0 && x >= 0){
                y = -y;
                neg = true;
            }else if( x < 0 && y < 0){
                x = -x;
                y = -y;
            }
    
            int res = 0;
            while(y!=0){
                if((y & 1) == 1) res += x;
                x <<= 1;
                y >>= 1;
            }
            return neg ? (-res) : res;
        }
    
        6
  •  0
  •   muzz    10 年前
    -(int)multiplyNumber:(int)num1 withNumber:(int)num2
    {
        int mulResult =0;
        int ithBit;
    
        BOOL isNegativeSign = (num1<0 && num2>0) || (num1>0 && num2<0)   ;
        num1 = abs(num1);
        num2 = abs(num2);
    
    
        for(int i=0;i<sizeof(num2)*8;i++)
        {
            ithBit =  num2 & (1<<i);
            if(ithBit>0){
                mulResult +=(num1<<i);
            }
    
        }
    
        if (isNegativeSign) {
            mulResult =  ((~mulResult)+1 );
        }
    
        return mulResult;
    }
    
        7
  •  0
  •   Nicolas    9 年前

    我刚刚意识到这和前一个答案是一样的。哈哈,对不起。

    public static uint Multiply(uint a, uint b)
    {
       uint c = 0;
       while(b > 0)
       {
          c += ((b & 1) > 0) ? a : 0;
          a <<= 1;
          b >>= 1;
       }
       return c;
    }