0

前学期、私はオペレーティング システムのクラスを受講しました。クラス全体が C で教えられていたことに驚きはしませんでしたが、C を多用することで、クラスの一部の人々を悩ませていたようです。コースが終わったとき、言語を嫌っていた何人かの人々が、再び C でプログラミングする必要がなくなったことにどれほど満足しているかについて声を上げていました。これにより、学生(および教師)の間で小さな議論が始まり、コースを教えた教師の1人からの返信で終わりました. 彼の答えは C コードで書かれていました。

#include <stdio.h>

unsigned char output[] = { 
0xe7, 0x3a, 0x1d, 0x2f, 0x01,
0x92, 0x42, 0x09, 0x48, 0x01,
0x92, 0x32, 0x09, 0x8e, 0x01,
0x92, 0x0a, 0x09, 0x48, 0x01,
0xe7, 0x73, 0xdd, 0x2f, 0x00,
};

int main() {
    unsigned char* wb;
    int i;
    for (wb = output; *wb; wb++) {

        if (*wb == 0x01) {
            printf("\n");
            continue;
        }

        for (i = 7; i >= 0; i--) {
            putchar((((*wb >> i) & 1) + 0x20));
        }
    }
    printf("\n");
    return 0;
}

これは以下を出力します:

!!!  !!!  !!! !    !!! !  ! !!!!
!  !  !  !    !     !  ! !  !   
!  !  !   !!  !     !  !!   !!! 
!  !  !     ! !     !  ! !  !   
!!!  !!! !!!  !!!! !!! !  ! !!!!

これは、私の人生でCコードで誰かがやっているのを見た中で最もクールなことです!!! これがどのように行われるかを誰かに説明できますか?

[編集: わかりやすくするためにインデントを調整]

4

2 に答える 2

1

ええ、調べてみるととても簡単です。

したがって、基本的に、彼は char ポインターを出力に割り当て、それを for ループで実行します。ヒットする 16 進数ごとに、i 回右にシフトします。i は 7 から始まり、i > = 0 です。

たとえば

./bits 0xe7 shift 7

============<<0xe7>>============
Decimal: 231 
Bits: [11100111] 

==========<<Shifted>>===========
Decimal: 1 
Bits: [00000001] >> 7

彼は続けて & (and) 結果に 1 を返します。この場合は次のようになります。

00000001
00000001
--------
       1

強打 (!) 文字の描画は のどちらかによって異なり、結果として「0」または「1」が返されます。これは、シフトされた/and の結果が 16 進数の 0x20 に追加されるためです。

0x20 は 10 進数の 32 であり、空白の文字表現を持っているため、 と がたまたま 0 を返す場合は、単に空白を描画します。そうでない場合は、1 が追加され、10 進数の 33 が得られます。バン。

もちろん、改行を表す終了値 0x00 と 0x01 があることを親切に指摘したように、注意すべき点はほとんどありません。

各行に 32 文字、つまり 4 * 8 を出力します。これは、16 進値ごとに 8 文字を出力しているためです。

答えを得るよりもずっと楽しかったので、これに対する私自身の解決策を提案してくれてありがとう;)

于 2013-10-15T13:53:55.063 に答える
1

1 つのヒントとして、配列のバイナリ表現について考えてみましょうoutput。この手法が登場する場所の 1 つは、組み込みシステムで行うようなハードウェア レジスタ内のビットの制御です。これは、C が真価を発揮する場所です。

于 2013-10-10T20:25:23.027 に答える