为什么要左移,右移?

时间:2022-12-13 14:50:12
int div(const int x, const int y) {
int left_num = x;
int result = 0;
while (left_num >= y) {
    int multi = 1;
    while (y * multi <= (left_num >> 1)) {
       multi = multi << 1;
    }
    result += multi;
    left_num -= y * multi;
}
return result;
}

先不说对不对,你给我讲讲这个的大体思路,为什么要左移,右移?

10 个解决方案

#1


左移相当于整除2余数不要,右移相当于乘以2
等价于下面的代码:

#include "stdafx.h"

#include <stdio.h>

int div(const int x, const int y) {
    int left_num = x;
    int result = 0;
    while (left_num >= y) {
        int multi = 1;
        while (y * multi <= (left_num/2)) {
            multi = multi *2;
        }
        result += multi;
        left_num -= y * multi;
    }
    return result;
}

void main(){
    printf("%d\n",div(9, 3));


#2


这个程序大体思路其实是用减法实现除法:
下面有个简化版的:

#include <stdio.h>

int div(const int cx, const int y)
{
    int result = 0;
    int x = cx;

    while (x > 0 )
    {
        ++result;
        x -= y;
    }

    return result;
}

void main()
{
    printf("%d\n",div(9, 3));


#3


"左移相当于整除2余数不要,右移相当于乘以2" 有了这句话楼主还有什么疑问?

#4


思路是:
从高到低位获取商的每一位。大循环中每次循环获取商的一个bit,第一次获取最高位,以后逐个获取更低位。
比如:x/y,用如下步骤
1. 得到一个整数,这个整数n的特点是:是二的的整数次幂,并且y*n的只值不超过x,那么我们就可以的出这个n就是尚商的最高位了。
2. 假设n就是x/y的商,可的到余数r,然后对r/y重复步骤1的运算。
如此反复得到每一位。

我这是手机上给我一解答,输的手都抽筋了,回头找个电脑给你详解。

#5



 while (y * multi <= (left_num >> 1)) {  
       multi = multi << 1;
    }

此处就是为了找到不大于left_num的y*multi。 由于multi是1<<n次得到的,故multi一定是2的n次幂。

#6


引用 3 楼 ai5209261314 的回复:
"左移相当于整除2余数不要,右移相当于乘以2" 有了这句话楼主还有什么疑问?


反了吧

#7


引用 6 楼 soloopin 的回复:
引用 3 楼 ai5209261314 的回复:
"左移相当于整除2余数不要,右移相当于乘以2" 有了这句话楼主还有什么疑问?


反了吧

应该是反了,不过貌似移位要考虑溢出吧?

#8


该回复于2011-11-02 13:35:36被版主删除

#9


引用 6 楼 soloopin 的回复:
引用 3 楼 ai5209261314 的回复:
"左移相当于整除2余数不要,右移相当于乘以2" 有了这句话楼主还有什么疑问?


反了吧


他是说反了!

#10


6楼被围观了……

#1


左移相当于整除2余数不要,右移相当于乘以2
等价于下面的代码:

#include "stdafx.h"

#include <stdio.h>

int div(const int x, const int y) {
    int left_num = x;
    int result = 0;
    while (left_num >= y) {
        int multi = 1;
        while (y * multi <= (left_num/2)) {
            multi = multi *2;
        }
        result += multi;
        left_num -= y * multi;
    }
    return result;
}

void main(){
    printf("%d\n",div(9, 3));


#2


这个程序大体思路其实是用减法实现除法:
下面有个简化版的:

#include <stdio.h>

int div(const int cx, const int y)
{
    int result = 0;
    int x = cx;

    while (x > 0 )
    {
        ++result;
        x -= y;
    }

    return result;
}

void main()
{
    printf("%d\n",div(9, 3));


#3


"左移相当于整除2余数不要,右移相当于乘以2" 有了这句话楼主还有什么疑问?

#4


思路是:
从高到低位获取商的每一位。大循环中每次循环获取商的一个bit,第一次获取最高位,以后逐个获取更低位。
比如:x/y,用如下步骤
1. 得到一个整数,这个整数n的特点是:是二的的整数次幂,并且y*n的只值不超过x,那么我们就可以的出这个n就是尚商的最高位了。
2. 假设n就是x/y的商,可的到余数r,然后对r/y重复步骤1的运算。
如此反复得到每一位。

我这是手机上给我一解答,输的手都抽筋了,回头找个电脑给你详解。

#5



 while (y * multi <= (left_num >> 1)) {  
       multi = multi << 1;
    }

此处就是为了找到不大于left_num的y*multi。 由于multi是1<<n次得到的,故multi一定是2的n次幂。

#6


引用 3 楼 ai5209261314 的回复:
"左移相当于整除2余数不要,右移相当于乘以2" 有了这句话楼主还有什么疑问?


反了吧

#7


引用 6 楼 soloopin 的回复:
引用 3 楼 ai5209261314 的回复:
"左移相当于整除2余数不要,右移相当于乘以2" 有了这句话楼主还有什么疑问?


反了吧

应该是反了,不过貌似移位要考虑溢出吧?

#8


该回复于2011-11-02 13:35:36被版主删除

#9


引用 6 楼 soloopin 的回复:
引用 3 楼 ai5209261314 的回复:
"左移相当于整除2余数不要,右移相当于乘以2" 有了这句话楼主还有什么疑问?


反了吧


他是说反了!

#10


6楼被围观了……