2 maoxunxing maoxunxing 于 2014.11.25 23:53 提问

关于C语言除法的一个优化问题
c

①y/4

if(y<0) y+=3;y >>= 2

①和②为什么是等价的?那个3是怎么弄出来的?

7个回答

caozhy
caozhy   Ds   Rxr 2014.11.26 00:04

代码不完整,二进制计算中,右移1位就是整除2,2位就是整除2再整除2(也就是4),以此类推。好比十进制中,小数点往右每移动一次,就是除以10,移动2个数字就是除以100。

maoxunxing
maoxunxing 谢提醒。
3 年多之前 回复
caozhy
caozhy   Ds   Rxr 2014.11.26 00:13

你确认你的代码贴全了么?显然这个根本不相干,不要说等价了。

91program
91program   Ds   Rxr 2014.11.26 07:22

3 就是 y/4 中的 4 -1

相当于除法,+3是为了处理余数。

91program
91program   Ds   Rxr 2014.11.26 07:23

补充一下,>>1 相当于除2,所以 >>2 相当于除4.

wll381200
wll381200   2014.11.26 13:46

y >>2 就是除4啊

g302syy
g302syy   2014.11.26 21:41

这明显不等价啊,最笨的办法拿个数验证一下就知道了

eagleyan
eagleyan   Rxr 2014.11.30 11:45

c的right shift是有符号shift,-1到-3的补码是1111...1 ~ 11111...01, right shift之后全部是 1111...1也就是-1.为了处理这种情况。这里先把它们变成正数。得到0.
其他小于-3的数没有问题。另外这里有人说你的代码不完整,其实是错误的。1和2就是等价的。:-D

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于C语言的除法运算的结果
进行除法运算的 / 和 %运算符的运算结果都是依赖于编译器的。1.当两个操作数都是正数的时候,不管是哪种编译器,商和余数都是正数。2.两个操作数中至少有一个为负时,/ 运算符的结果是“小于代数商的最大整数”还是&quot;大于代数商的最小整数&quot;,要取决于编译器。说一个和主题无关的C 语言的特性就是scanf这个函数当需要输入两个值的时候,可以这么做:scanf(&quot;%d%d&quot;,&amp;amp;a,&amp;amp;b),在...
C语言实现大数据除法
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。输入格式:输入在1行中依次给出A和B,中间以1空格分隔。输出格式:在1行中依次输出Q和R,中间以1空格分隔。输入样例: 123456789050987654321 7 输出样例: 17636684150141093474 3代码实现如下#include "stdi
大数除法 C语言
大数除法的核心:把除法运算转化为减法运算
如何用C编写除法和求模函数
一直以来都不明白,如果单片机没有
c语言编程提高除法运算的精度
计算机由于受存储因素限制,不能实现精准的除法运算,要求编程实现高精度的除法运算(精确到小数点之后任意位数)。下面是代码:代码块代码块语法遵循标准markdown代码,例如:#include<stdio.h> int main(void) { int a,b,c,n,i; //a是除数,b是被除数,n是需要精确的位数 scanf("%d%d%d",&a,&b,&n);
C语言中两个整型数据的高精度除法
算法: 首先输出x/y的整数部分,对其余数u=x%y试商n次,以满足精度要求。 每次试商:x=u*10为被除数,y为除数,商x/y(整数)作为结果的一位打印输出,余数为u=x%y。若u不等于0,继续试商,直到u=0或是达到试商的n位为止。 算法来自:杨克昌编著《计算机程序设计典型例题精解》之高精度窗,国防科技大学出版社出版。 /*两个整数数据的高精度除法*/ #inclu
C语言中除法怎么取得小数
除了一开始用float进行定义之外, 后面进行除法运算的时候要加.0, 否则算出的结果电脑会自动取整~~ 如:3/2的结果和3.0/2的结果就不同~~ 因为没有定义3/2为浮点型,所以3/2自动取整, 结果等于1 而3.0/2,由于预先用浮点型表示 其结果显然为:1.5
C语言 高精度除法
#include #include int len1,len2; char s1[905],s2[905]; int re[905]; void sub() { int i=0,j; while(1) { if(s1[i]=='0') i++; else {
超大整数出除法的C语言实现
好啊。可以欣赏哈俺们的作品,谢谢
(C语言)高精度除法
题目描述 高精度除法:给定一个很大很大的数字,用它来除以一个 int 或 long 范围内的整数。  输入 输入包括多组测试数据。 对每组测试数据,在一行中给出一个整数N(0 输出 对每组输入数据, 在一行中输出 N 除以 d  的结果(N/d). 如果被除数 N 不为零,除数d为0 ,则输出"Inf" (不包含引号," 'Inf' refers to