|
|
如果不限制 逻辑非运算 (!)
形如: x==a 或 x==b 或 x==c 或 x==d 的逻辑可以用较简的形式实现:- set /a "or=^!(x^a)|^!(x^b)|^!(x^c)|^!(x^d)"
- if !or!==1 rem 即 x==a 或 x==b 或 x==c 或 x==d
复制代码 如果不用逻辑非运算, 有这种方式来实现:- 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)"
- if !or!==0 rem 即 x==a 或 x==b 或 x==c
复制代码 更多节的形式依此类推.
严谨的测试应在范围 [-0x80000000 .. 0x7fffffff] 内进行, 但耗时巨大; 以下代码只在小范围 [-0xff .. 0xff] 内进行测试:- @echo off & setlocal enabledelayedexpansion
- :next
- for %%i in (a b c) do set /p %%i=%%i:
- for /l %%i in (-0xff 1 0xff) do (
- 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)"
- if !or!==0 echo !x! & rem 即 x==a 或 x==b 或 x==c
- )
- goto :next
复制代码 |
评分
-
查看全部评分
|