『楼 主』:
[分享]位运算演示
找不见了,重新发...
以前自己写的一个位运算演示的代码(函数的调用改为netbenton的方法),现拿出来和大家分享一下,希望能让初学者对位运算有更深刻的认识...
@echo off
title 位运算示例 code by:cn-dos-moniuming
echo.
echo.位运算名词解释(个人理解):
echo.
echo.位运算: 按操作数在计算机内表示的二进制数逐位进行逻辑运算或移位运算.
echo.与(^&): 全部都是1才为1(指返回值,下同),否则为0.
echo.或(^|): 只要有1则为1,否则为0.
echo.异或(^^): 不同为1,相同为0.
echo.取反(~): 是1则0,是0则1(单目运算符).
echo.取负(-): 先取反再加1(单目运算符).
echo.左移n位(^<^<n): 相当于乘以2的n次方(用0补位).
echo.右移n位(^>^>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
此帖被 +15 点积分 点击查看详情 评分人:【 plp626 】 | 分数: +15 | 时间:2009-10-12 18:19 |
|
|