How can I perform multiplication without the '*' operator?

前端 未结 30 1519
别跟我提以往
别跟我提以往 2020-12-01 01:47

I was just going through some basic stuff as I am learning C. I came upon a question to multiply a number by 7 without using the * operator. Basically it\'s like this

<
30条回答
  •  眼角桃花
    2020-12-01 02:27

    If you can use the log function:

    public static final long multiplyUsingShift(int a, int b) {
        int absA = Math.abs(a);
        int absB = Math.abs(b);
    
        //Find the 2^b which is larger than "a" which turns out to be the 
        //ceiling of (Log base 2 of b) == numbers of digits to shift
        double logBase2 = Math.log(absB) / Math.log(2);
        long bits = (long)Math.ceil(logBase2);
    
        //Get the value of 2^bits
        long biggerInteger = (int)Math.pow(2, bits);
    
        //Find the difference of the bigger integer and "b"
        long difference = biggerInteger - absB;
    
        //Shift "bits" places to the left
        long result = absA<0) {
            result -= difference;
            diffLoop--;
        }
    
        return (a>0&&b>0 || a<0&&b<0)?result:-result;
    }
    

    If you cannot use the log function:

    public static final long multiplyUsingShift(int a, int b) {
        int absA = Math.abs(a);
        int absB = Math.abs(b);
    
        //Get the number of bits for a 2^(b+1) larger number
        int bits = 0;
        int bitInteger = absB;
        while (bitInteger>0) {
            bitInteger /= 2;
            bits++;
        }
    
        //Get the value of 2^bit
        long biggerInteger = (int)Math.pow(2, bits);
    
        //Find the difference of the bigger integer and "b"
        long difference = biggerInteger - absB;
    
        //Shift "bits" places to the left
        long result = absA<0) {
            result -= difference;
            diffLoop--;
        }
    
        return (a>0&&b>0 || a<0&&b<0)?result:-result;
    }
    

    I found this to be more efficient:

    public static final long multiplyUsingShift(int a, int b) {
        int absA = Math.abs(a);
        int absB = Math.abs(b);
    
        long result = 0L;
        while (absA>0) {
            if ((absA&1)>0) result += absB; //Is odd
            absA >>= 1;
            absB <<= 1;
        }
    
        return (a>0&&b>0 || a<0&&b<0)?result:-result;
    }
    

    and yet another way.

    public static final long multiplyUsingLogs(int a, int b) {
        int absA = Math.abs(a);
        int absB = Math.abs(b);
        long result = Math.round(Math.pow(10, (Math.log10(absA)+Math.log10(absB))));
        return (a>0&&b>0 || a<0&&b<0)?result:-result;
    }
    

提交回复
热议问题