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

问题描述

关于C语言除法的一个优化问题
①y/4

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

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

解决方案

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

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

解决方案三:
3 就是 y/4 中的 4 -1

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

解决方案四:
补充一下,>>1 相当于除2,所以 >>2 相当于除4.

解决方案五:
y >>2 就是除4啊

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

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

时间: 2024-09-17 00:31:41

c-关于C语言除法的一个优化问题的相关文章

利用Go语言初步搭建一个web应用的教程

  这篇文章主要介绍了利用Go语言初步搭建一个web应用的教程,由于很多国人盲目迷信谷歌,导致Go语言在国内的人气远超国外...需要的朋友可以参考下 1.Abstract 在学习web开发的过程中会遇到很多困难,因此写了一篇类似综述类的文章.作为路线图从web开发要素的index出发来介绍golang开发的学习流程以及Example代码. 在描述中多是使用代码来描述使用方法不会做过多的说明.最后可以方便的copy代码来实现自己的需求. 本文适应对象: 对web开发有一定经验的人 能够灵活使用aj

图片-有关C语言数组的一个小问题

问题描述 有关C语言数组的一个小问题 这是题目 这是我做的 但是不知道为什么我这个写出来只能完成一半 那个"不存在"的提醒不管什么情况都会显示出来 想请教一下啊 谢谢了 解决方案 首先i应该从0开始赋值,否则就会把a[0]也就是T漏掉.其次,判断不存在应该是所有位置都找过以后以后才能判断确实不存在,而不是每个位置都在判断. 具体做法是把不存在的输出放在循环体外面进行判断,然后增加一个变量t并赋初值为0,在找到的时候让t的值变为1,这样一来可以明白:在循环完成之后如果t的值为1就说明找到

图片-用c语言写出一个行李托运问题

问题描述 用c语言写出一个行李托运问题 解决方案 请教一个C语言问题关于<c语言的一个小问题>的补充 解决方案二: c语言行李托运问题.

c语言-关于C语言浮点的一个练习题

问题描述 关于C语言浮点的一个练习题 今天看深入理解计算机系统,浮点那一节一个习题.看不明白什么意思. 求指点,谢谢··· 题目: A.假定一个k位指数和n位小数的浮点格式,给出不能准确描述的的最小正整数的公式. (因为要想准确表示它需要n+1位小数) B.对于单精度格式(k=8,n=23),这个整数的数字值是多少? 答案: 这个练习帮助你思考什么数是不能准确表示的. 这个数的二进制表示是:1后面跟着n个0,其后再跟1,得到值:2的n+1次方+1. 当n=23时,值是:2的24次方+1=16 7

网站-用JAVA语言如何做一个服务器

问题描述 用JAVA语言如何做一个服务器 我要做一个网站,接收终端机发来的信息并且处理,再发数据给终端机,这样该怎么做 解决方案 java开发网站后台服务器端,看你的规模了. 如果网页简单你就直接使用这个Servlet进行开发就可以了. 很方便就可以实现了. 如果比较复杂,那你就考虑使用框架吧. 使用SSH或者是SSI框架组合进行开发. 假定你已经想好了你的网站的访问Url,业务处理方法,以及你存储数据的数据库的设计都OK,制作流程大致如下 (如果没有,你先从纸面分析设计下你的系统都有什么功能(

怎么在c语言程序中一个读入函数

问题描述 怎么在c语言程序中一个读入函数 在c语言中如何读入一个函数 ,并且运用这个函数? 我在编写科学计算器的定积分运算的时候遇到了需要用户自己输入一个函数然后才 能计算该函数的定积分的问题.请问1怎么才能读入一个函数,并利用这个函数呢? 解决方案 http://download.csdn.net/detail/lpw32682770/1587368 解决方案二: 读入函数是什么意思,编译器自带的库里的函数只要引入对应的头文件就可以使用了,如果是封装在DLL里的函数要先获得函数的地址 解决方案

c语言-急!用C语言编的一个学生籍贯信息记录簿出现问题

问题描述 急!用C语言编的一个学生籍贯信息记录簿出现问题 用c语言编了一个学生籍贯信息记录簿,发现只要进行一次修改或删除操作,全部信息输出(allselect函数)时,开头就会有学号为-842150451,姓名为屯屯屯屯屯屯,籍贯为屯屯屯屯屯屯的一项,每进行一次就会多出一项,为什么? 能帮忙修改一下吗? 是allselect(全部输出)函数的问题? 还是jgedit(修改)和jgdelete(删除)这两个函数的问题? 这是代码的链接:用vc6编的,默认后缀cpp 帮忙修改一下这段代码吧 解决方案

c语言-C语言如何输出一个变量的地址

问题描述 C语言如何输出一个变量的地址 scanf("%d",&a); 假如我输入"10",那这个"10"的地址怎么求,怎么输出来呢? 解决方案 你要好好看看指针的定义和运用. 你可以定义一个整型指针 int p: 然后定义一个整型变量 int a: p的值是一个整型变量的地址 &是取地址操作符 **p = &a:* 这样,指针变量p保存的就是整型变量a的地址了 你要引用整型变量a,可以直接使用变量本身a,也可以通过指针间

用C语言实现统计一个文件夹中各种文件的比例

原文:用C语言实现统计一个文件夹中各种文件的比例 <UNIX环境高级编程>中的程序清单4-7就介绍了如何实现递归地统计某个目录下面的文件!我刚开始看过它的代码后,觉得照着敲太没意思了,所以就合上书自己写了一遍!为此还写了一篇博文,这是博文地址:在linux下用C语言实现递归查看某个目录中的所有文件[CSDN]! 今天做<Unix环境高级编程>的课后题,看到题目4.11这里提供了一种新的实现这个程序的思路,那就是每回读到一个目录,就通过chdir函数进入到这个目录,然后再通过open