[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
@echo off&setlocal enabledelayedexpansion
set len=1&for /l %%a in (1,1,256) do (set/a len=len^<^<1,1/len 2>nul || (set len=%%a&goto :lp))
set len=512&rem 首先测出字长,应该达不到512位吧?
:lp
(set n=
set o=
set s=
set ns=
echo.
set /p n=输入一个整数:)
(if "%n%"=="" goto :eof
for /l %%a in (1,1,!len!) do (
        set/a m=n%%2,n=n^>^>1
        set s=!s!!m:~-1!
        set o=!m:~-1!!o!
        set/a ns=^(ns^<^<1^)+m
)
echo 正二进制:!o!   {%n%}
echo 逆转输出:!s!   {!ns!}
goto :lp)

TOP

Re:netbenton
        我想正确的思路是不能留下隐患,至于有没有512的我不清楚,但计算机是不断发展的,也要考虑程序能适应以后的发展。当然在效率要求不是太严格或如需改变但代码变动不大的情况下也可以。
    还有个小问题,就是兄的代码在输入负数的情况下,逆转后的十进制数的正负存在点儿小问题。

TOP

re 楼主

已经解决通用和符号问题
  1. @echo off&setlocal enabledelayedexpansion
  2. set/a len=1,n=1
  3. :rep
  4. set/a len=len+len,n=n^<^<len,1/n 2>nul&&goto :rep
  5. :lp
  6. (set n=
  7. set o=
  8. set s=
  9. set ns=
  10. echo.
  11. set /p n=输入一个整数:)
  12. (if "%n%"=="" goto :eof
  13. for /l %%a in (1,1,!len!) do (
  14. set/a m=n%%2,n=n^>^>1,m*=m
  15. set s=!s!!m!
  16. set o=!m!!o!
  17. set/a ns=^(ns^<^<1^)+m
  18. )
  19. echo 正二进制:!o!   {%n%}
  20. echo 逆转输出:!s!   {!ns!}
  21. goto :lp)
复制代码
真的还可以精简,把一些地方换成了按位运算,更快更简
但初始化还是保持用set,反正只有四行,按字数来算还更少一点。
  1. @echo off&setlocal enabledelayedexpansion
  2. set/a len=1,n=1
  3. :rep
  4. set/a "len<<=1,n<<=len,1/n" 2>nul&&goto :rep
  5. :lp
  6. set n=&set o=&set s=&set ns=&echo.&set /p n=输入一个整数:
  7. (if "%n%"=="" goto :eof
  8. for /l %%a in (1,1,%len%) do (
  9. set/a "m=n&1,n>>=1,ns=ns<<1|m"
  10. set s=!s!!m!
  11. set o=!m!!o!
  12. )
  13. echo 正二进制:!o!   {%n%}
  14. echo 逆转输出:!s!   {!ns!}
  15. goto :lp)
复制代码

[ 本帖最后由 netbenton 于 2009-4-27 22:44 编辑 ]
1

评分人数

    • lhjoanna: 不错,代码还可再精简!PB + 8

TOP

Re:netbenton
         执行结果,要求都正确,代码还有几处可以精简的地方。进入循环刚开始的四个变量清空操作可以在循环首尾用一对setlocal enabledelayedexpansion和endlocal代替。还有可移植性的另一种思路在12楼与15楼都有体现!

TOP

今天忽然想到了用递归来算,代码以32位为例,效率也没有纯位运算高,仅作研究。
  1. @echo off
  2. set /p "value=INPUT:"
  3. set /a "i=1<<31",flag=1
  4. call :loop %i%
  5. pause>nul&goto :eof
  6. :loop
  7. set /a "i=%1,n=i&value,i>>=1,n=!(!n)"
  8. if %flag% equ 1 set /a i="1<<30" &set flag=0
  9. if %i% neq 0 (call :loop %i% %n%) else <nul set /p=%n%
  10. <nul set /p=%2
复制代码

TOP

以前写的2进制转换的  改下 不知通否
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p a=INPUT:
  3. set i=1
  4. for /l %%i in (31,-1,0) do (
  5.     set/a n=^!^(^!^(a%%2^)^)2>nul
  6.     set/a i*=n"<<"%%i,d+=i,i=1
  7.     set b=!b!!n!
  8.     if !a! geq 2 (set/a a/=2)else set a=0
  9.   )
  10. echo Decimal:%d% &echo Binary :%b%
  11. pause
复制代码

TOP

兄的代码在负数情况有些小问题

TOP

原帖由 lhjoanna 于 2009-5-1 11:54 发表
兄的代码在负数情况有些小问题

是的  有问题  这样呢
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p a=INPUT:
  3. for /l %%i in (31,-1,0) do (
  4.     set/a "n=a&1,a>>=1,d+=n<<%%i"
  5.     set b=!b!!n!
  6.   )
  7. echo Decimal:%d% &echo Binary :%b%
  8. pause
复制代码
1

评分人数

TOP

返回列表