找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 20954|回复: 3

[分享]批处理位运算和加法实现或逻辑:x==a或x==b或x==c

[复制链接]
发表于 2012-3-30 02:14:45 | 显示全部楼层 |阅读模式
如果不限制 逻辑非运算 (!)
形如: x==a 或 x==b 或 x==c 或 x==d 的逻辑可以用较简的形式实现:
  1. set /a "or=^!(x^a)|^!(x^b)|^!(x^c)|^!(x^d)"
  2. if !or!==1 rem 即 x==a 或 x==b 或 x==c 或 x==d
复制代码
如果不用逻辑非运算, 有这种方式来实现:
  1. set /a "ea=x^a,eb=x^b,ec=x^c,ma=~ea>>31,mb=~eb>>31,mc=~ec>>31,or=((ea+ma)^ma)&((eb+mb)^mb)&((ec+mc)^mc)"
  2. if !or!==0 rem 即 x==a 或 x==b 或 x==c
复制代码
更多节的形式依此类推.

严谨的测试应在范围 [-0x80000000 .. 0x7fffffff] 内进行, 但耗时巨大; 以下代码只在小范围 [-0xff .. 0xff] 内进行测试:
  1. @echo off & setlocal enabledelayedexpansion
  2. :next
  3. for %%i in (a b c) do set /p %%i=%%i:
  4. for /l %%i in (-0xff 1 0xff) do (
  5.   set /a "x=%%i,ea=x^a,eb=x^b,ec=x^c,ma=~ea>>31,mb=~eb>>31,mc=~ec>>31,or=((ea+ma)^ma)&((eb+mb)^mb)&((ec+mc)^mc)"
  6.   if !or!==0 echo !x! & rem 即 x==a 或 x==b 或 x==c
  7. )
  8. goto :next
复制代码

评分

参与人数 2PB +5 技术 +2 收起 理由
CrLf + 5 + 1 实用
batman + 1 多谢分享

查看全部评分

发表于 2012-3-30 08:45:36 | 显示全部楼层
如果是纯数值的话,我想乘法就可以了:

  1. @echo off
  2. set /p num=请输入数值:
  3. set /a "total=(num-34)*(num-65)*(num-96)*(num-203)*(num-4312)"
  4. if %total% equ 0 (
  5.   echo 输入的数值正确
  6. ) else (
  7.   echo 输入的数值不正确
  8. )
  9. pause>nul
复制代码
发表于 2012-3-30 09:35:58 | 显示全部楼层
本帖最后由 fatcat 于 2012-3-30 09:55 编辑

回复 2# batman

在数值较小时, 乘法很难发生溢出并得到 0 的结果的情形, 但还是存在的(乘积的理论二进制数尾数有32个或更多的0就发生了):
set /a 0x10000*0x10000

式中如果只存在位运算和逻辑非运算, 那么溢出(移位是正常利用,故除外)是不会发生的;


ma=~ea>>31,....... or=((ea+ma)^ma......
式中的加法是加了一个符号 ma (只有两种可能 0 和 -1),   加 -1 仍可能发生溢出:
set /a 0x80000000-1
造成结果错误, 这种溢出仅在这个最小的负数出现时才发生.
发表于 2012-3-30 10:25:04 | 显示全部楼层
为何要相异呢,简单的-就可以了吧
set /a "or=!(x-a)|!(x-b)|!(x-c)|!(x-d)"
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 21:12 , Processed in 0.023510 second(s), 12 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表