challenge 2進数の記述

 コンピューターの原理は2進数だというのに、多くのプログラミング言語で8進数や16進数しか記述できないのは少し変だとは思いませんか?
 そこで、ソース中に2進数を定数として書く方法、またはその代替手段を考えてください。

ある程度の評価基準を示します(できるところまでで構いません)。
・2進数の表示方法は0と1
・桁数は可変長
・コンパイル等の後に最適化等によって定数に変換されることが見込まれる

Cで関数として実装したものを示しておきます。
1
2
3
4
5
int bin(int b1, int b2, int b3, int b4, int b5, int b6, int b7, int b8){
    return b1<<7 | b2 <<6 | b3<<5 | b4<<4 | b5<<3 | b6<<2 | b7<<1 | b8;
}

int byte = bin(0, 1, 1, 0, 1, 0, 0, 1);

Posted feedbacks - Batchfile

バッチには 2進数のリテラル表記はありませんので、お題の例を参考に書いてみました。

なお、最上位ビットは符号として扱われます。

  e.g.
    C:\>bin 0 1 1 0 1 0 0 1
    105

    C:\>bin 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    2147483647

    C:\>bin 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    -1

    C:\>bin 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    -2147483648

遅延環境変数展開を利用しているので、Windows NTでは動作しません。Windows XPで動作
を確認。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
:: bin.bat
@echo off
  setlocal enabledelayedexpansion
    set i=0
    set t=%*

    echo %t: =%|findstr /r "[^01]" >NUL 2>&1
    if %ERRORLEVEL% equ 0 (call :usage & goto :EOF)

    for %%i in (%*) do set /a i+=1

    set t=
    for %%i in (%*) do (
      set /a i-=1
      set t=!t!%%i^<^<!i!
      if !i! gtr 0 set t=!t! ^| 
    )

    set /a t="%t%"
  endlocal & echo %t%
goto :EOF

:usage
  setlocal
    echo %~n0 [NUMBER] ...
  endlocal
goto :EOF

Index

Feed

Other

Link

Pathtraq

loading...