
[分享]批處理位運算演示在論壇里看到netbenton的那個不用call調用函數的帖子(下面貼有鏈接)后,突然記起以前自己寫的一個位運算演示的代碼(用call來調用函數,現改用netbenton的方法另類的調用),現拿出來和大家分享一下,希望能給初學者一些小小的幫助...批處理函數的高效另類應用方法
nclick="copycode($('code0'));">復制代碼
- @echo off
- title 位運算示例 code by:cn-bathome-more
- echo.
- echo.位運算名詞解釋(個人理解):
- echo.
- echo.位運算: 按操作數在計算機內表示的二進制數逐位進行邏輯運算或移位運算.
- echo.與: 全部都是1才為1(指返回值,下同),否則為0.
- echo.或: 只要有1則為1,否則為0.
- echo.異或: 不同為1,相同為0.
- echo.取反: 是1則0,是0則1(單目運算符).
- echo.取負: 先取反再加1(單目運算符).
- echo.左移n位: 相當于乘以2的n次方(用0補位).
- echo.右移n位: 相當于除以2的n次方(負數用1補位,正數用0補位).
- echo.
- echo.下面的示例是在三十二位系統(數值范圍:-2147483648~2147483647)下運行的結果.
- echo.請輸入批處理能處理的數值(整數),否則將不能正確處理.如發生溢出,結果也不會正確.
- echo.
- rem 將十進制轉換為二進制的函數.
- set fun_d2b=setlocal enabledelayedexpansion&(for /l %%a in (0 1 31) do (set /a str=!#a#!^>^>%%a&set /a str^&=1&set str_d2b=!str!!str_d2b!))&(for %%a in (!str_d2b!) do (endlocal&set #a#=%%a))
- setlocal enabledelayedexpansion
- :agn
- set in=&set /p in=請輸入兩個數(中間用空格隔開):
- if not defined in exit
- set n=0
- for %%a in (%in%) do (
- set /a n+=1
- set /a num!n!=%%a 2>nul
- )
- cls
- echo.輸入的兩個數的有效數值為: !num1! 和 !num2!, 用二進制表示分別為:
- set /a str1=num1,str2=num2
- %fun_d2b:#a#=str1%
- %fun_d2b:#a#=str2%
- echo.&echo.!str1!==^> !num1!
- echo.!str2!==^> !num2!
- echo.&echo.各種位運算的結果如下:
- set /a num=!num1!&!num2!,t=num
- %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位與: !num1! ^& !num2! = !t!
- set /a num=!num1!|!num2!,t=num
- %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位或: !num1! ^| !num2! = !t!
- set /a num=!num1!^^!num2!,t=num
- %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位異或: !num1! ^^^^ !num2! = !t!
- set /a num=~!num1!,t=num
- %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位取反:~(!num1!) = !t!
- set /a num=-!num1!,t=num
- %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 取負:-(!num1!) = !t!
- set /a ran=%random%%%5+2,num=!num1!,num<<=ran,t=num
- %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 左移!ran!位: !num1! ^<^< !ran! = !t!
- set /a ran=%random%%%5+2,num=!num1!,num>>=ran,t=num
- %fun_d2b:#a#=num%&echo.&echo.!num! ==^> 右移!ran!位: !num1! ^>^> !ran! = !t!
- echo.&goto :agn

