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 - Other

ビルトイン関数 bin2dec() があります.

1
bin2dec('01101001')

Mac OS X (PowerPC 32bit) アセンブリでは二進数リテラルがありませんが、マクロを使うと定数を二進数表記で定義することができます。可変長の桁数は、マクロでは無理です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
        .machine ppc
        .globl  _main

        .macro  DEFBIN
                $0=$1<<7|$2<<6|$3<<5|$4<<4|$5<<3|$6<<2|$7<<1|$8
        .endmacro

DEFBIN BINNUM,1,1,1,1,1,1,1,1
        
_main:
        li      r10, BINNUM
        ...

Factor はリテラル表記があります。

1
BIN: 0110100

Forthでは、基数が"BASE"という変数で定義されています。
この値を変えることで、何進数でもリテラルを記述することが可能です。

また、以下の基数を変更する関数が定義されています。
:DECIMAL ( -- 基数を10に変更する ) 10 BASE ! ;
:BINARY ( -- 基数を 2に変更する )  2 BASE ! ;
:OCTAL  ( -- 基数を 8に変更する )  8 BASE ! ;
:HEX    ( -- 基数を16に変更する ) 16 BASE ! ;
1
BINARY 01101001 DECIMAL .

Index

Feed

Other

Link

Pathtraq

loading...