
[分享]批處理位運算和加法實現或邏輯x==a或x==b或x==c如果不限制 邏輯非運算 (!)形如: 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
nclick="copycode($('code0'));">復制代碼
如果不用邏輯非運算, 有這種方式來實現:
- 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
nclick="copycode($('code1'));">復制代碼
更多節的形式依此類推.嚴謹的測試應在范圍 [-0
x80000000 .. 0
x7fffffff] 內進行, 但耗時巨大; 以下代碼只在小范圍 [-0
xff .. 0
xff] 內進行測試:
- @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
nclick="copycode($('code2'));">復制代碼