注册
登录
论坛
搜索
帮助
导航
私人消息 (0)
公共消息 (0)
论坛任务 (0)
系统消息 (0)
好友消息 (0)
帖子消息 (0)
批处理之家
»
出题挑战
» 【练习-055】批处理根据输入数求出cmd范围内最大次方数
[新手上路]
批处理新手入门导读
[视频教程]
批处理基础视频教程
[视频教程]
VBS基础视频教程
[批处理精品]
批处理版照片整理器
[批处理精品]
纯批处理备份&还原驱动
[批处理精品]
CMD命令50条不能说的秘密
[在线下载]
第三方命令行工具
[在线帮助]
VBScript / JScript 在线参考
 
1
2
3
4
下一页
返回列表
发帖
CrLf
发短消息
加为好友
CrLf
当前离线
UID
30406
帖子
6388
精华
2
积分
18843
PB
15777
技术
982
捐助
100
阅读权限
255
在线时间
5536 小时
注册时间
2010-10-9
最后登录
2024-5-10
论坛巡查
帖子
6388
积分
18843
技术
982
捐助
100
注册时间
2010-10-9
16
楼
跳转到
»
发表于 2011-3-14 16:30
|
只看该作者
set /a n*=num,"max+=((n-1)>>31)+1","test=1/n/(!max!-max)"||goto re
这句用到了很多技巧,可读性降低,不过却是高效计算的核心代码,可读性在我看来一向是要排在高效、简洁、避免临时文件这几点之后的。
[
本帖最后由 zm900612 于 2011-3-14 18:32 编辑
]
链接:
在线第三方命令行工具下载
bat、vbs、js 原生混编
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID
30406
帖子
6388
精华
2
积分
18843
PB
15777
技术
982
捐助
100
阅读权限
255
在线时间
5536 小时
注册时间
2010-10-9
最后登录
2024-5-10
论坛巡查
帖子
6388
积分
18843
技术
982
捐助
100
注册时间
2010-10-9
17
楼
发表于 2011-3-14 16:41
|
只看该作者
忽然想到这正是判断n是否为2的倍数的最快办法:set /a "test=1/(1073741824*n)"||echo %n%为2的倍数
链接:
在线第三方命令行工具下载
bat、vbs、js 原生混编
TOP
qzwqzw
发短消息
加为好友
qzwqzw
(活着就是幸福)
当前离线
UID
3023
帖子
508
精华
2
积分
1490
PB
1219
技术
87
捐助
0
阅读权限
254
来自
五湖四海,咫尺天涯
在线时间
347 小时
注册时间
2008-7-17
最后登录
2021-5-22
贵宾
帖子
508
积分
1490
技术
87
捐助
0
注册时间
2008-7-17
18
楼
发表于 2011-3-14 17:29
|
只看该作者
没办法台式机网络有点问题,使用手机回复比较累,简短点吧。关于溢出我不多讲,你测试下100000试试,看跟我的代码是否结果一致。
天的白色影子
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID
30406
帖子
6388
精华
2
积分
18843
PB
15777
技术
982
捐助
100
阅读权限
255
在线时间
5536 小时
注册时间
2010-10-9
最后登录
2024-5-10
论坛巡查
帖子
6388
积分
18843
技术
982
捐助
100
注册时间
2010-10-9
19
楼
发表于 2011-3-14 17:44
|
只看该作者
已测试,100000结果为1,呵呵,有test的存在是不可能多次溢出的
链接:
在线第三方命令行工具下载
bat、vbs、js 原生混编
TOP
qzwqzw
发短消息
加为好友
qzwqzw
(活着就是幸福)
当前离线
UID
3023
帖子
508
精华
2
积分
1490
PB
1219
技术
87
捐助
0
阅读权限
254
来自
五湖四海,咫尺天涯
在线时间
347 小时
注册时间
2008-7-17
最后登录
2021-5-22
贵宾
帖子
508
积分
1490
技术
87
捐助
0
注册时间
2008-7-17
20
楼
发表于 2011-3-14 17:48
|
只看该作者
请测试你的乘法算法
我这里结果是2
除法算法天生不存在溢出问题我是知道的
天的白色影子
TOP
qzwqzw
发短消息
加为好友
qzwqzw
(活着就是幸福)
当前离线
UID
3023
帖子
508
精华
2
积分
1490
PB
1219
技术
87
捐助
0
阅读权限
254
来自
五湖四海,咫尺天涯
在线时间
347 小时
注册时间
2008-7-17
最后登录
2021-5-22
贵宾
帖子
508
积分
1490
技术
87
捐助
0
注册时间
2008-7-17
21
楼
发表于 2011-3-14 17:55
|
只看该作者
台式机网络刚恢复
set /a "test=1/(1073741824*n)"||echo %n%的技巧值得借鉴
不过乘法比较消耗CPU
改成“字节与”更好些
set /a "m=1/(n&1)"||echo %n%是偶数
天的白色影子
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID
30406
帖子
6388
精华
2
积分
18843
PB
15777
技术
982
捐助
100
阅读权限
255
在线时间
5536 小时
注册时间
2010-10-9
最后登录
2024-5-10
论坛巡查
帖子
6388
积分
18843
技术
982
捐助
100
注册时间
2010-10-9
22
楼
发表于 2011-3-14 18:15
|
只看该作者
巧妙,位运算还是用得太少,没第一时间想到这方向
测试了下正算法,真的有溢出...而且十分诡异,为什么set /a n=100000*100000结果是1410065408??溢出不是应该变成负数么?
链接:
在线第三方命令行工具下载
bat、vbs、js 原生混编
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID
30406
帖子
6388
精华
2
积分
18843
PB
15777
技术
982
捐助
100
阅读权限
255
在线时间
5536 小时
注册时间
2010-10-9
最后登录
2024-5-10
论坛巡查
帖子
6388
积分
18843
技术
982
捐助
100
注册时间
2010-10-9
23
楼
发表于 2011-3-14 18:30
|
只看该作者
调试了一下,发现100000的溢出很奇怪,以下数据均为 【每次循环的n值 max值】:
请输入大于1的正整数:100000
100000 1
1410065408 2【100000*100000=1410065408???】
-1530494976 2
确切地说是大于46340(约等于极限值的开方)的数可能都有问题:
请输入大于1的正整数:46340
46340 1
2147395600 2
214822976 3【第三次循环时发生溢出,但是不转负】
-837484288 3
302580736 4
链接:
在线第三方命令行工具下载
bat、vbs、js 原生混编
TOP
qzwqzw
发短消息
加为好友
qzwqzw
(活着就是幸福)
当前离线
UID
3023
帖子
508
精华
2
积分
1490
PB
1219
技术
87
捐助
0
阅读权限
254
来自
五湖四海,咫尺天涯
在线时间
347 小时
注册时间
2008-7-17
最后登录
2021-5-22
贵宾
帖子
508
积分
1490
技术
87
捐助
0
注册时间
2008-7-17
24
楼
发表于 2011-3-14 20:04
|
只看该作者
标题
没什么可怪异的,计算机的数集就像个圆,一个数不断累加,就像在圆上行走,等加到正数最大值时,就走了个半圆,再走一步就是负数最大值,然后继续延负数轴向前,直到走回零点,就画了一个整圆。然后重新开始,周而复始。类似于道家的阳极生阴,阴极生阳理论。数学上的数集也有类似的特性。溢出为正数不过是在数集圆上走的更远,越过了负数所在的半圆,又回到正数圆而已。不知道这样说你明白了没有?
1
评分人数
batman:
很牛的解释,一语惊醒梦中人啊
技术 + 1
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID
30406
帖子
6388
精华
2
积分
18843
PB
15777
技术
982
捐助
100
阅读权限
255
在线时间
5536 小时
注册时间
2010-10-9
最后登录
2024-5-10
论坛巡查
帖子
6388
积分
18843
技术
982
捐助
100
注册时间
2010-10-9
25
楼
发表于 2011-3-14 20:59
|
只看该作者
不敢苟同,个人见解如下:
溢出导致由正转负我可以理解,因为2147483647在cmd中的二进制形态为01111111111111111111111111111111,而-1则是1111111111111111111111111111110,所以数值计算时超过2147483648的部分会被当成负数,根本原因就是首位由0转1,才会正负逆转。
但是要发生逆转,必须达到1000000000000000000000000000000000000的数量级,可是有什么正数能同时满足下列方程组呢?
{m+n=32
m+n+n>64}
链接:
在线第三方命令行工具下载
bat、vbs、js 原生混编
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID
30406
帖子
6388
精华
2
积分
18843
PB
15777
技术
982
捐助
100
阅读权限
255
在线时间
5536 小时
注册时间
2010-10-9
最后登录
2024-5-10
论坛巡查
帖子
6388
积分
18843
技术
982
捐助
100
注册时间
2010-10-9
26
楼
发表于 2011-3-14 21:06
|
只看该作者
哦,我晕,之前糊涂了,这里用的不是加而是乘,如果是加法确实不存在连续两次溢出,乘法溢出的可能就很大了
链接:
在线第三方命令行工具下载
bat、vbs、js 原生混编
TOP
qzwqzw
发短消息
加为好友
qzwqzw
(活着就是幸福)
当前离线
UID
3023
帖子
508
精华
2
积分
1490
PB
1219
技术
87
捐助
0
阅读权限
254
来自
五湖四海,咫尺天涯
在线时间
347 小时
注册时间
2008-7-17
最后登录
2021-5-22
贵宾
帖子
508
积分
1490
技术
87
捐助
0
注册时间
2008-7-17
27
楼
发表于 2011-3-14 21:12
|
只看该作者
抱歉,方程组没看懂
只看到二进制的-1写错了
不知道这样写如何?
二进制 十进制
00...0 0
00...1 1
......
01...1 2147483647
10...0 -2147483648
......
11...1 -1
00...0 0
......
天的白色影子
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID
30406
帖子
6388
精华
2
积分
18843
PB
15777
技术
982
捐助
100
阅读权限
255
在线时间
5536 小时
注册时间
2010-10-9
最后登录
2024-5-10
论坛巡查
帖子
6388
积分
18843
技术
982
捐助
100
注册时间
2010-10-9
28
楼
发表于 2011-3-14 21:31
|
只看该作者
再理论化地解释一下:
假设计算范围为8位二进制00000000~11111111,也就是0~128,或者说-64~63,此时:
加法溢出:
十进制:64+64=128
二进制:1000000+1000000=10000000
十进制:65+65=130
二进制:1000001+1000001=10000010
发生溢出,由于二进制倒数第八位为1,所以由正转负,在cmd中分别变为-128和-126
乘法溢出:
十进制:64*64=4096
二进制:1000000*1000000=1000000000000
十进制:65*65=4225
二进制:1000001*1000001=1000010000001
两个算式的结果都超过11111111,于是发生溢出,只获取最后八位,也就是00000000和10000001,换算为cmd中的十进制分别为0与-127
所以结论是,当数值在n*2*128~(n*2+1)*128-1范围内时为正,而在(n*2-1)*128-1~(n*2+1)*128范围内时为负,不知道有没有讲错,反正大概意思是这样。
乘法之所以会出现同一个数值乘某数后,正数溢出仍为正数是因为数值前后跨度超过256,于是溢出之后再溢出,负负得正。这在加法中是不可能出现的,我之前脑筋歪了,把乘法当加法去了
[
本帖最后由 zm900612 于 2011-3-14 21:34 编辑
]
链接:
在线第三方命令行工具下载
bat、vbs、js 原生混编
TOP
CrLf
发短消息
加为好友
CrLf
当前离线
UID
30406
帖子
6388
精华
2
积分
18843
PB
15777
技术
982
捐助
100
阅读权限
255
在线时间
5536 小时
注册时间
2010-10-9
最后登录
2024-5-10
论坛巡查
帖子
6388
积分
18843
技术
982
捐助
100
注册时间
2010-10-9
29
楼
发表于 2011-3-14 21:32
|
只看该作者
正如27楼所言,咱俩说的恰恰是同一个事
链接:
在线第三方命令行工具下载
bat、vbs、js 原生混编
TOP
qzwqzw
发短消息
加为好友
qzwqzw
(活着就是幸福)
当前离线
UID
3023
帖子
508
精华
2
积分
1490
PB
1219
技术
87
捐助
0
阅读权限
254
来自
五湖四海,咫尺天涯
在线时间
347 小时
注册时间
2008-7-17
最后登录
2021-5-22
贵宾
帖子
508
积分
1490
技术
87
捐助
0
注册时间
2008-7-17
30
楼
发表于 2011-3-14 22:10
|
只看该作者
嗯,看着理论尤其是数字算式就头大如斗
只看到8位二进制的可表示范围错了(不好意思)
不是"0~128,或者说-64~63"
而是“0~256,或者说-128~127”
天的白色影子
TOP
 
1
2
3
4
下一页
返回列表
批处理专区: BAT CMD DOS
BAT求助&讨论
BAT教程&资料
BAT原创&转载
BAT新大陆
BAT转载代码
新手练功
出题挑战
有偿求助
第三方命令行
开源原创工具
iBAT
Take Command
其他脚本区
PowerShell求助&讨论
PowerShell教程&资料
PowerShell原创&转载
VBS求助&讨论
JS / JScript / JavaScript
VBS教程&资料
VBS原创&转载
UNIX/Linux Shell
Python
Perl
网络资源区
电脑技术研讨
精品软件交流
论坛事务区
站务交流
意见反馈
论坛公告
版主申请
交换链接
建站杂谈
活动专区
论坛总版规
[收藏此主题]
[关注此主题的新回复]
[通过 QQ、MSN 分享给朋友]