仕様書 - みる会図書館


検索対象: 月刊 C MAGAZINE 2000年6月号
184件見つかりました。

1. 月刊 C MAGAZINE 2000年6月号

差の比率を変えています。 FIoyd & Steinb erg 型では右・下・左下・右下の順に比率を 大きくしています。 Floyd & Steinberg 型と 同じく右・左下・下・右下の 4 画素に誤差を 分散する場合でも , この比率を変えること で違った結果が得られるので , いろいろと 工夫する余地があると思いますが , 一般的 には近くの画素の比率を大きくします。 より多くの画素に割り振る方法として , Jarvis , Judice & Ninke 型誤差分散法があ ります。これは Fig. 5 のように 2 画素離れた 画素にまで誤差を分散させます。前述のよ うに誤差分散法ではより多くの画素に誤差 を分配するほうが処理結果の向上が期待で きます。これは , 少ない画素にのみ誤差を 割り振ると , 画素値の変化が大きくなって しまうからです。しかし , 多くの画素に分 配するとそれだけ処理時間がかかってしま TabIe 1 工フェクトプラグインで用いる A 曰関数 PMsGetCoIorOnImage 機能画像上の任意の画素値を取得する うので , 処理結果を見極めたうえでどこま で画素を分配するかを決定したほうがよい と思います。 プログラミングと結果 以上のアルゴリズムを元にプログラムを 作成してみましよう。サンプルプログラム は今回も Pmacs のエフェクトプラグインと して実装しています。 Pmacs プラグインの 仕様については最後に示す Web サイトを参 こではプログラムを解 照してください。 析するうえで必要と思われる関数を TabIe 1 にあげておきます ( なお , Pmacs の機能上 の理由により , 表示上は減色した画像が表 示されますが , 内部データはフルカラーの ままです ) 。 誤差分散法では減色後の色集合はどんな CD 旧 *img int x,y Pix32 *col 引数 画像データ 指定する座標 } P ⅸ 32 : }citem; unsigned char opa; unsigned Char 「 : unsigned cha 「 g, unsigned char b; struct { unsigned long COIO 「 : typedef union { ここで , 画素値が設定される / * カラー値 * / / * 透明度 * / 戻り値座標が画像内なら T 日 UE , 画像外なら FALSE PMsSetCoIorOnlmage 機 引 能 数 画像上の任意の画素値を設定する CD 旧 *img GRAM32 * out int x,y Pix32 * col int 「 eg int flag なし 画像データ 結果をセットする領域 指定する x , y 座標 セットする画素値 座標の種類を表す。工フェクタの場合は FALSE でよい 領域情報 ( 通常は与えられたものをそのまま渡せばよい ) 戻り値 ものでもかまいませんが , サンプルプログ ラムでは 16 色への減色処理を行っていま す。しかし , プログラム本体はどのような 色集合に対しても処理できるように作成し ているので , 色集合を別途与えるようにす ればどのような色集合にも対応可能です。 List 1 は誤差を隣の画素にすべて分配す る誤差分散法を行うプログラムです。処理 としては元画素と減色後の色との誤差を求 め , 次の画素を処理する際にこの誤差を元 の画素値に加えた値をその画素の画素値と して減色後の値を求めるようにします。減 色後の色集合を pR , pG, pB の配列で与え ています。このプログラムでは原色 8 色な どの 16 色を固定で与えるようになっていま すが , この配列を別に設定できるようにす れば , これ以外の色集合でも処理可能です。 減色処理では , 色集合の配列のなかからも っとも画素値の近いものを選ぶ徹底探索法 を用いています。 List 2 は Floyd & Steinberg 型誤差分散法 のプログラムです。この場合 listl と異なり , 下部に割り振った誤差は下部列の処理が終 わるまで保持しておく必要があるので , 誤 差を格納するバッフアを用意してここに誤 差を記録していくようにします。 誤差を格納するバッフアとしては処理す る画像と同じ大きさを用意するのがもっと も簡単ですが , 処理の終わった画素に対す る誤差は保持する必要がないので , 2 列ぶ んだけでも処理は行えます。 List2 では処理 中の列とその下列の 2 列ぶんのバッフアを ことで , 誤差の分散方法を変更しやすくな を用意しています。また , このようにする なる恐れがあるので , 2 列ぶんのバッファ になりアルゴリズムの流れがわかりにくく でも処理は行えますが , プログラムが煩雑 振らないので , 下 1 列ぶんのバッフアだけ 分散法では同じ列では隣にしか誤差を割り 用意しています。 Floyd & Steinberg 型誤差 1 1 2 C MAGAZINE 2000 6

2. 月刊 C MAGAZINE 2000年6月号

最新国ロロレポ - ト JavaBeans プロバティ作成 Fig. 4 各種デバッグ情報の表示 や system main Signal dispatcher い Thread-O runO : 99. sun amscreenupdater. ScreenUpdater.java ←ト三 nextEntryO . 四 . sun awt.ScreenlJpdater,ScreenUpdater.java &*waitO : 424. 旧 v 引 ang. Ob ct. Object.java ト W tO . -1,java.lang.Object, Objectjava や screen Updater ← 0 TimerQueue ト山 nO 479. java.langThread,Thread.java e-»this={sun.awt.windowsvroolkit@3a1} 9 「 unO. 13 れ sun awtWindows.WToolkit,WToolkit.java ト eventLOOPO : -1. sun.aWt.WindowsMoolkit,Moolkitjava ト runO - 413 , sun awt.PostEventQueue. SunT001kitjava ・ wa 0 : 424.java.lang. Object,Object.java ・ *w 0 : -1. va 」 ang. Ob ct. Ob 山 ava や SunToolkitPOStEventQueue-O AWT-EventQueue-O ・ヨ「リ nO :114,javalang ref.Reference$ReferenceHandler, Reference.java 物引 tO : 424 」 ava 」 ang. Ob は 0 切 ec い a 槌 ←・ W tO :-1. java.lang.Object. Object.java や、 ReferenceHandler Fig. 5 第づロバティの加ー lin き CO 「 、℃ 0 に一 づロバティ ー . ルという プロリィの物 ~ 」 3 COI 研 ーに 3 材 COlor 、しい凵気、 1 ミゴロテン名 : 簡学な説叫 : 新 新 れ日 : n00 日 ま 0 ⅶ onFo 頑 ョ下 0 用 を S “ ノ物により提催 *bu onFO 祺 員 0 ⅶ onF0 キャンセル ヘルプ 更新 0 日 na に師 ることができる (Fig. 4 ) 。 ProfessionaI 版 /Enterprise 版では , ソー スウインドウで変数の上にカーソルを置く とツールチップに値が表示される。 Found ation 版にはこの機能はないが , ウォッチ機 能などで代替できる。また Professional 版以 上はサープレットのデバッグ機能を持ち , Enterprise 版では JSP のテパッグもサポート する。 JavaBeans 開発支援 ProfessionaI 版 /Enterprise 版には , Java Beans , サープレット , JSP, JDataStore , EJB, CORBA などの開発支援機能が含ま れている。このなかから一例として , Java Beans 開発支援機能を取りあげてみる。 初めに JavaBeans 作成ウイザードを用い て Bean の雛形を生成する。プロバティ作 成やイベント設定など , Bean 構築作業の 多くは対話形式で行う (Fig. 5 ) 。 BeanInfo やプロバティエデイタに関しても 編集が可能である。また , GUI コンポーネ ントを配置する場合にはビジュアルデザイ ナが利用できる。 ほかにもアプリケーション , アプレット , サープレットなどのウイザードが準備され , Bean の検証用ツールである "BeanInsight' も用意されている。 144 C MAGAZINE 2000 6 こでは , とめ 100 % Java で構築した開発ッ ことで , 正直なところ , 試用する前は速度 や操作性の点で不安があった。同様の懸念 を持たれている方も少なくないであろう。 速度の面では , ネイテイプコードで構築 した開発ツールに比べるとやはり動作が重 い。とくにメニューやツリーを操作したと きのもたっきが気になる。言葉で表現する のは難しいが , あえてたとえるなら , Win dows 98 のスタートメニュー表示がもたっ く感覚に近い。これはおそらく Swing コン ポーネントの動作が重いのであって , JBui Ider3.5 自体の作りに起因するものではない。 むしろ JBuilder 3.5 は , 100%Pure Java アフ リケーションとしては , 複雑な機能を搭載 しているにもかかわらずかなり高速な部類 であろう。 Pentium Ⅱ 400MHz 程度のマシ ンでも , まあまあ実用的な速度ではある。 最新の高速なマシンならばあまりストレス を感じないかもしれない。 ただ , 些細なことかもしれないが , ソー スコードエデイタや各種ツリービューにお いて , スクロールのためにマウスのホイー ルが使えないことがもどかしい。これは 100 % PureJava ゆえの仕方ない制限である。 全体としては , 機能の豊富さと隙のなさ , 完成度の高さに驚いた。無償で利用できる F 。 unda ⅱ。 n 版も数々の魅力的な機能を備え ている。普段は JDK で足りている方々も , JBuilder 3.5 のデザイナやデノヾッガを便利に 感じる局面が必ずあると思われる。ぜひ本 社の付録などを活用して , お試しいただき ロ心、 たいものである。 Borland JBuilder 3.5 < 価格 > Borland JBuilder 3.5 Foundation ( web より登録ダウンロード ) Borland JBuilder 3.5 ProfessionaI 68 , 000 円 BorIand JBuilder 3.5 Enterprise 無料 < 動作環境 > メモリ ードディスク 360 , 000 円 128M バイト以上 150M バイト以上 ・ Windows プラットホーム lntel Pentium Ⅱ / 233MHz 以上 Microsoft Windows 98/NT 4.0 ・ Linux プラットホーム lntel Pentium Ⅱ / 233MHz 以上 IASER 5 Linux 6.0 または日本語 Red Hat Linux 6.1 glibc 2.1.1 以上 , カーネルバージョン 2.2.5 以上 Sun JDK 1.2.2 以降 ・ SO ぬ「 is プラットホーム ULTRASparc 2 以上 Solaris 2.6 または SoIaris 7 ( 2.7 )

3. 月刊 C MAGAZINE 2000年6月号

TabIe 5 WSAGetLastE 「「 0 「関数が返す工ラーコード つのファイルを閉じて , メモリを解放しま シンボル コード 工ラーメッセージ す。リソースを解放する前に リソースが プロック操作は WSACance 旧 lockingCall の呼び出しに割り込 WSAEINTR 割り当てられていたかどうかを調べます。 10004 まれました。 終了ハンドラが呼ばれるのは , 例外によ WSAEBADF 供給されたファイルハンドルが無効です。 10009 アクセス許可で禁じられた方法でソケットにアクセスしようと る一一文プロック外への制御の移行以外 WSAEACCES 10013 しました。 に , goto 文によるジャンプ , 10n mp 関数 呼び出しでポインタ引数を使用するときに無効なポインタア WSAEFAULT 10014 によるジャンプがあります。ただし , Visual ドレスを検出しました。 WSAEINVAL 無効な引数が提供されました。 10022 C + + には 10n ⅵ mp 関数が 2 種類あり , setjmpe WSAEMFILE 開いているソケットが多すきます。 10024 x. h ファイルをインクルードした場合には終 WSAEWOULDBLOCK プロック不可のソケット操作をすぐに完了できませんでした。 10035 了ハンドラが呼ばれますが , setjmp. h をイ WSAEINPROGRESS プロック操作を実行中です。 10036 ンクルードした場合には終了ハンドラが呼 既に操作が進行中のプロック不可のソケットに対して , 操作を WSAEALREADY 10037 実行しようとしました。 ばれない代わりに 10n ⅵ mp 関数によるジャ WSAENOTSOCK ソケット以外のものに対して操作を実行しようとしました。 10038 ンプの速度が速くなります。 WSAEDESTADDRREQ ソケットの操作から必要なアドレスを省略しました。 10039 なお , ー _finally 文プロックのなかで , 例 テータグラムソケットで送信されたメッセージが , 内部のメッ セージのバッファ , またはほかのネットワークの制限を超えて 外ハンドラや終了ハンドラをネストするこ WSAEMSGSIZE います。または , データグラムの受信に使われるバッフアがデ とはできません。また , goto 文を使って , ータグラムより小さく設定されています。 ー t Ⅳ文プロックや一団 nally 文プロックのな ソケットの関数呼び出しでプロトコルが指定されましたが , 要 WSA E P 日 OTOTYP E 求したソケットの種類の形式をサポートしていません。 かにジャンプすることはできませんが , ー仕 getsockopt または setsockopt の呼び出しで指定されたオプシ y 文プロックのなかから外へジャンプする WSAENOPROTOOPT ョン , またはレベルは , 不明か , 無効か , あるいはサポートさ 10042 ことはできます。一団 nally 文プロックのな れていません。 要求したプロトコルがシステムに構成されていないか , または かから外へジャンプすると , 例外が発生し WSAEPROTONOSUPPORT 存在しません。 て終了ハンドラが実行されている場合でも 指定したソケットの種類は , このアドレスファミリでサポート WSAESOCKTNOSUPPORT 通常のコードに制御が移ってしまうため , されていません。 実行しようとした操作は , 参照したオブジェクトの種類ではサ その関数は正常終了してしまいます。 __fin WSAEOPNOTSUPP ポートされていません。 a Ⅱ y 文プロックのなかで return 文を使っても プロトコルファミリがシステムに構成されていないか , または WSAEPFNOSUPPORT 10046 同様です。 存在しません。 WSAEAFNOSUPPORT 要求したプロトコルと互換性がないアドレスを使用しました。 10047 通常 , 各ソケットアドレスに対してプロトコル , ネットワーク ユーザ関数のエラー対処 WSAEADDRINUSE 10048 アドレス , またはボートのどれかひとつのみを使用できます。 WSAEADDRNOTAVAIL 要求したアドレスのコンテキストが無効です。 10049 WSAENETDOWN ソケット操作によりネットワークの停止が検出されました。 10050 こまで , C 言語のランタイムライプラ 到達できないネットワークでソケット操作を実行しようとしま リや OS の API 関数が返す工ラーコードへの WSAENETUNREACH 10051 操作の実行中に keep - a ⅱ ve 動作によってエラーが検出されたた _finally 文の例 WSAENETRESET め , 接続が切断されました。 確立された接続がホストコンピュータのソウトウェアによって WSAECONNABORTED 10053 中止されました。 WSAECONNRESET 既存の接続はリモートホストに強制的に切断されました。 10054 システムのバッフア領域が不足しているか , またはキューがい WSAENOBUFS 10055 っぱいなため , ソケット操作を実行できませんでした。 WSAEISCONN 既に接続済みのソケットに対して接続を要求しました。 10056 ソケットが接続されていないか , sendto 呼び出しを使ってデー WSAENOTCONN タグラムソケットで送信するときにアドレスが指定されていな 10057 いため , データの送受信を要求することは禁じられています。 ソケットが以前のシャットダウンの呼び出しでシャットダウン されているため , データの送受信を要求することは禁じられて 10058 います。 あるカーネルオブジェクトへの参照が多すきます。 10059 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しな かったため , 接続できませんでした。または接続済みのホスト 10060 が応答しなかったため , 確立された接続は失敗しました。 10040 10041 10043 10044 10045 5 10052 FiIeOps( ) FILE *fpl, *fp2, *fp3; LPVOID lpvoid; ゆ VO 土 d = fpl = fp2 = fp3 = NULL• ゆ vo 土 d = malloc( BUFFERSIZE fpl = fopen ( "TESTI. DAT" "TEST2. DAT", ” w 十″ fp2 = fopen ( "TEST3. DAT" , ” w 十” fp3 = fopen( void WSAESHUTDOWN WSAETOOMANYREFS WSAETIMEDOUT 0 0 0 ド ~ 0 4 ド ~ よ 4 ーー ・エーエ・ 1 ー 1 24 C MAGAZINE 2000 6

4. 月刊 C MAGAZINE 2000年6月号

TabIe 1 JBu ⅱ de 「 3.5 のバージョンと機能 機能概要 100 % Pu 「 eJava アプリケーション , アプレットの開発支援 Windows/SOIa 「 is/Linux 上で動作 Java 2 プラットホーム対応 Java 2 対応の Just-In-Time (JIT) コンバイラ フラウザ / 工デイタ / デバッガ / コンバイラ / ヘルプを統合 Java 2 (JFC/Swin ) ん avaBeans 対応のビジュアルデザイナ プロジェクト / アプレット / クラスの作成ウイザード JBu ⅱ de 「の開発環境へサードバーティ製ツールを統合できる 0 en T00 API CUA および Emacs キーバインドのサポート Java/lDL/SQL/HTML/JSP/XML/XSL/C + + などに対応した構文ハイライト表示 メンバ / メソッド / メソッド引数 / バッケージ名ん ava 構文の入力支援 構文工ラーの解析 / 表示 ウォッチ / ステップ実行 / ブレークポイント / メソッド末尾までの実行 / 評価 / ステップアウト / ブレークポイン トのロギング / 条件デバッグ デバッガ J 団デバック A 曰に対応 マルチプロセスデバッグ 200 以上の JavaBeans を提供 JavaBeans ソースコード隠蔽機能 基本機能 ( 強化 ) 複数バージョンの JDK を切り替え可能 高速なコンバイラ ダイアログ / フレーム〃 ( ネル作成ウイザード 統合開発環境 ( 強化 ) Java インタフェイス実装 / クラスのオーバライド / 抽象メソッドの実装を支援するウイザード CVS を利用したソースコード管理 / カスタムウイザード / ビューワなどの OpenToo サンプル コード入力支援機能 ( 強化 ) チーム開発用にカスタマイズ可能なコードテンプレート J 団テパッグ A 曰に対応したすべての JDK に対応 デバッガ ( 強化 ) ステップ実行方式のカスタマイズ ツールチップによる評価とカスタマイス可能なコードテンプレート JavaBeans 作成ウイザード プロバティ / イベント / Bea 司 nfo のビジュアル定義 開発した JavaBeans の動作チェック サンプル JavaBeans のソースコード ハ - ドコ - ドされた文字列からリソースファイルを生成するウイザード 複数言語をサポートするリソースファイルの同時編集 国際化対応をサポートするビジュアルデザイナ プロバティファイルの編集支援 複数言語をサポートしたサンプルアプリケーション JA 日ファイル作成ウイザード マ二フェストファイルの自動生成 サーブレット作成ウイザード 内蔵 Web サーバによるサーブレットの実行 JDBC 準拠によるデータベースシステムのビジュアル開発支援 ( DataEx 「 ess) データベース接続 / マスタ・ティテール関係 / ピックリスト / 参照 / 複数テーブルのジョイン / トランザクショ ンなどをサポートするデータアクセスコンポーネント JFC/Swin べースのデータベース対応コントロール SQL 作成 / リソース化支援 モバイルコンピューティングを実現する Pu 「 e Java によるストレージデータベース オプジェクトストレージ / 同時接続性 / トランザクション管理 / SQL -92 準拠のクエリエンジン 詳細なブレークポイント設定 スレッドのテットロック状態の自動検出と検知機能 デバッグ機能 ( 強化 ) 別プロセスで起動している Java アプリケーションへの接続機能 分散アプリケーションのリモートデバッグ サーブレットのデバッグ サーブレット開発 ( 強化 ) サーブレットのテンプレート データベースアプリケーション開発襁化 ) DataEx 「 ess ソースコード JSP 作成ウィサード 内蔵 Web サーバによる JSP の実行 JSP アプリケーション JSP のテパッグ 開発 JSP のテンプレート ショッピングカートシステムなどのサンプル J2EE に準拠した EJB をビジュアル開発 EJB インタフェイスウイザード EJB 1 . 1 の XML 配布ディスクリプタの生成支援 CORBA 2.3 仕様に準拠 / Java 2 完全対応の VisiB 「 oke 「 4.0 の開発ライセンス付属 IDL サンプルウィサード CO 日 BAHTML クライアントアプリケーションウイザード CO 日 BA サーバアプリケーションウイザード 工デイタにおける IDL シンタックス対応 CORB Ⅳ日 M ーによるクレジットカード承認のサンプル Foundation P 「 0 厄 ssion 引版 nterprise 版 〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇 〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇 〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇 基本機能 統合開発環境 工デイタ コード入力支援機能 JavaBeans ( 強化 ) 国際化 アプリケーション配布 サーブレット開発 データベース アプリケーション開発 JDataSto 「 e Ente 「 p 「 ise JavaBeans(EJB) C O 日 BA 対応分散 オプジェクト 142 C MAGMINE 2000 6

5. 月刊 C MAGAZINE 2000年6月号

領域が確保されます。これが数十階層まで 継承され , インスタンスの数が数十個とな ると , だんだんと無視できない値になりま す。 さらにコントロールやメニューは , ウィ ンドウにいくつでも自由に配置することが できるため , あらかじめこれらの仮想関数 を定義しておくことはできません。必然的 にアプリケーションごとに , メッセージと コールバック関数を動的に対応付ける手段 が必要となります。 MFC ではディスパッチテープルと呼ばれ るマクロ定義でメッセージとハンドラを関 連付けます。また , この操作は ClassWrzard と呼ばれるツールで , 対話的に行うことが できます。理想として , アプリケーション コアのビジネスロジックと , ユーザインタ フェイスは分離したいという要求がありま す。このような要求に応えるために , Qt の シグナル / スロット機構や Swing のアクショ ンリスナーでは , イベントのコールバック ルーチンとして , ほかのクラスのメソッド を設定することができます。 今回のクラスライプラリでは , 少々風変 わりな方法でコントロールのイベントを処 理します。各コントロールで発生したイベ ントは , 親ウインドウではなく , そのコン TabIe 2 GD はブジェクトの比較 トロール自身で処理するというものです。 ボタンをクリックした場合は , ボタンクラ スの OnCIick メソッドが呼ばれます。 Wmdows においては , ウインドウ (mWin dow) クラスと同様にボタンの生成時に SetP r 叩 API で , 自身のインスタンスアドレスを 登録します。ウインドウブロシージャの hWnd には親ウインドウのハンドルが渡さ れますが , lParam にはコントロールのウィ ンドウハンドルが渡されます。この lParam よりコントロールのインスタンスアドレス を求め , コールバックを呼び出します。ポ タンクラスとウインドウブロシージャを List 13 に示します。 Motif(Lesstif) では , ウインドウ (mWindo w) クラスとまったく同じ方法で定義できま す。 Motif(Iæsstif) 上でのクラス定義とコー ルバック呼び出し方法を List14 に示します。 この方法により , コントロールのイベン トとコールバックを動的に関連付ける必要 はなくなります。しかし実際にこの方法で 作成されたライプラリを使って , アプリケ ーションを作成してみると , コールバック は親ウインドウのメソッドとして存在した ほうが便利なようです。なぜなら , ボタ ンクリック時に行う処理では , ほとんどの 場合において , 同じウインドウ上に存在す 新新 3 クラスライララリ 作成術 るほかのコントールを参照する必要がある からです。これは Qt や Swing で , コールノヾ ックを親ウインドウ以外のクラスメソッド に設定した場合にもいえることです。 Motif(Lesstif) にはメニューバー , プルダ ウンメニュー , ポップアップメニューとい ったウィジェットがそろっています。また W1ndows においても動的メニューをサポー トする API として , CreateMenu , CreatePo pupMenu , AppendMenu といったものがそ ろっているため , 比較的問題なくカプセル 化できる部分です。 Mo ⅱ f ( ss ⅱ f ) においてメニューは , ウィ ンドウやコントロールと同じ概念で存在す るため , ウインドウやコントロールとまっ たく同じ方法で , イベントを処理すること ができます。しかし Windows においてメニ ューはウインドウと異なる種類のハンドル で管理され , SetPr 叩 API でプロバティを設 定することはできません。 この解決法として , これもあまりスマー トな方法ではありませんが , メニュー ID ( コントロール (D) を文字列化したものを , メニュークラス 内容 Wi ndows ビットマップ バレット ブラシ リージョン フォント X Window System ピックスマップ カラーマップ なし なし なし フォント X Window System にもビットマップという言葉は存在するが , これは白黒のみのピックスマップを 意味する。 X Window System のネイティブな画像フォーマットはピックスマップであり , Windows のビットマップとは形式が異なる 絵の具のバレットと同様の概念で , デバイスで現在使える色のテーブル 線の色 , 幅 , 線種を管理するもので , X Window System では GC に直接設定する 塗りつぶしの色 , バターンを管理するもので , X Window System では GC に直接設定する Windows のリージョンは単に領域を表現しこの領域でクリッピングしたり , 多角形ウインドウを作 成したりと用途はいろいろある。 X Window System にはこのようなオプジェクトはないが , クリッ ピングを行う領域 ( マスク ) をピックスマップで指定することは可能 X WindowSystem では Xlib とツールキットで操作方法が異なる 特集 3 クラスライブラリ作成術 77

6. 月刊 C MAGAZINE 2000年6月号

コラム 3 。 3 、 インラインアセンブラの移植性 ィックスとして加える いにかかわらず , 翻訳プログラム as が必要 こでは , インテルの X86 プラットホー ・ GAS Syntax では即値オペランドを指 です。これは , gcc がアセンプラソースを出 ムにおけるⅥ sualC + + と gcc のインラインア 定する場合に , 値の前に $ をプレフィ センプラ機能を比較してみましよう。 力するトランスレータだからです。 ックスとして加える インラインアセンプラ機能により , C / C + + こでインラインアセンプラ機能を利用 ・ GAS Syntax ではメモリオペランドの した簡単な例を示します。グローバル変数 のソース中に直接アセンプラのコードを記 サイズを表す 1 文字を , OP コードの最 述することが可能となります。 Visual C + + any-address で示される変数の値に 2 を加え , 後に加える。サイズを表す 1 文字は b ( 8 では「一 asm 」また「一一 asm 」キーワードのあと ローカル変数 i に代入するものです。 C + + に ビット ) 、 w ( 1 6 ビット ) , K32 ビット ) の に , gcc では「 asm 」または「一—asm—」キー よるオリジナルのソースコードは List A の いずれかである ワードのあとにコードを記述します。 とおりです。これをそれぞれのインライン ・間接アドレスの指定方法が 'ln 回 Syntax インラインアセンプラ機能を利用すると , アセンプラで記述すると List B のようにな では [ ] で , GAS Syntax では ( ) となる アセンプルステップを必要とせずに実行形 ります。 上記以外にもさまざまな違いが存在しま 式を作成することが可能となりますöVisuaI 見た目はずいぶんと違ったイメージにな す。複数行を指定する場合のシンタックス C + + においては , アセンプラさえ必要あり ります。 Visual C + + で採用されているシン も , V1sual C + + , gcc ともに何通りかの方法 ません。 C / C + + コンパイラ自身がアセンプ タックスは , インテルの提唱するもので があります。上記の例では G Syntax にお ラシンタックスを翻訳します。 gcc の場合 lntel Synt と呼ばれるものです。 MASM や いて , 行の終了に「 \ \ t 」を設定しています。 は , インラインアセンプラを使用するしな TASM にも採用され , みなさんもなじみの また VisuaI C + + ではローカル変数名を直接 ものではないでしようか。一方 gcc で採用 C + + によるオリジナルのソースコード 指定できますが , gcc では Constraints と呼 されているシンタックスは , GAS Syntax や ばれる構文を利用します ( グローバル変数 AT&TSyntax と呼ばれるもので , IntelSynt 土 n セ *any—address; は , gcc でも直接参照可能 ) 。 と比較すると次に示す違いがあります。 void any-func( ) 関数のプロローグ , エピローグコードは , ・ Source と Destination のふたつのオペラ Visual C + + でも gcc でも理論的に同様に生成 ンドを持つ命令において , それぞれが されます。プロローグコードを List C に示 逆となる します。 ・ GASSyntax ではレジスタを指定する ローカル変数は , ebp からの OFFSLT を指 場合に , レジスタ名の前に % をプレフ 定すれば理論的には同様の指定方法が可能 インラインアセンブラで List A を書き直した例 となりますが , ローカル変数がスタック上 に確保される順序も宣言順になるとはかぎ りません。 GNU AssembIer(GAS) はアセンプラファ ミリと呼ばれ , すべてのプラットホームに 共通概念の提供を目指しています。 GAS Syntax は , モトローラの 68000 シリーズで使 われているアセンプラのシンタックスに似 ていると思われた方も多いのではないでし ようか。 移植性を考えるなら同じプロセッサ上で も , インラインアセンプラを使用すること は無謀といえそうです。 関数のプロローグコード //ebp を stack に保存 push ebp / / ebp に esp の値を設定する ebP' esp mov //esp より auto 変数の領域を引く sub eSP' nnn int *any—address 十 = 土 = *any-address; 〃 (visual C 十十の場合 ) int *any—address; void any—func( ) int 土ー _asm { //any—address のアドレスを e に代入 eax, [any-address] mov //any-address の値に 2 を加える add [eaxl, 2 //any—address の値を ebx に代入 ebx, [eax] mov 〃 ebx の値を i に代入 [ebp-4] , ebx mov 〃 [ ebp -4 ] を i と直接指定することもできる / / ( GCC の場合 ) int *any—address; void any-func( ) int asm( ” addl ″ //any-address のアドレスを eax に代入 (any-address) , %eax n に //any-address の値に 2 を加える //any-address の値を ebx に代入 ( e ) , %ebx / / ebx の値を i に代入 %ebx, -4(%ebp) / / -4 ( 宅 ebp ) を土と直接指定できない 68 C MAGAZINE 2000 6

7. 月刊 C MAGAZINE 2000年6月号

特 クラスライララリ 作成術 X Window System のイベント 一方 X Window System におけるツールキ ットプログラミングでは , ウイジェットに 対してコールバック関数を登録します。ウ ィジェットで発生したイベントごとに , 対 応するコールバックを登録することができ ます。クラス内の各メソッドをコールバッ クとして登録できれば理想的ですが , これ にはちょっとした問題があります。クラス のメンバ関数には隠れた引数 this が存在す るからです。 Xt からのコールバック呼び出 しでは , この隠れた引数 this が存在しない ため , 引数が正しく渡されません。 ツールキットのプログラミングモデルは C 言語をベースとして設計されており , C + + から利用する場合はちょっとした工夫が必 要となります。この問題を解決する方法は , ふたつあります。ひとつは普通 ( クラスのメ ンバ関数でない ) の関数をコールバックと して登録し , そこから該当するメンバ関数 を呼び出します。この場合 , クラスのプラ イベートメンバにアクセスする必要があれ よう。ウインドウブロシージャ内では , イ しまいます。抽象クラスやクラス階層の導 ば , この関数はフレンド関数にしたほうが べントの発生したウインドウハンドル ( 引 出方法は , オプジェクト指向設計の専門書 よいでしよう。もうひとつの方法は , クラ 数の hWnd) からウインドウクラスのインス スの静的 ( sta ⅱ c ) メンバ関数をコールバック こではイベントの対処法を Wmd タンスを求め , そのコールバック関数 ( 仮 ows と Motif(Lesstif) に分けて解説します。 として登録する方法です。多少なりともオ 想関数 ) を呼び出します。つまりウインド プジェクト指向らしいので , こではクラ Windows のイベント ウハンドルと , クラスのインスタンスを 1 対 スの静的メソッドを利用することにします。 1 に対応付ける手法が必要となります。 普通の関数や静的メンバ関数の呼び出し これを実現する方法として , グローノヾル ご存じのように Wrndows のイベントは , では , this ポインタは引数として渡されま な検索テープルを用意する方法もあります ウインドウブロシージャにメッセージとし せん。しかしコールバック関数内から , 該 が , 今回は SetPr 叩 , GetProp API を利用し 当するインスタンスのメソッドを呼び出す て送られます。ウインドウブロシージャに は , HWND ( ウインドウハンドル ) と Msg ました。これらの API は , ウインドウに任 ために , インスタンスアドレスを求める手 ( メッセージ ) , さらに wParam, lParam と 意のハンドルをプロバティとして設定した 段が必要となります。これはコールバック り , 取得したりすることができます。ウィ を登録するときに , クライアントデータと いった引数が渡されます。 ウインドウブロシージャは , アプリケー して自身のポインタを渡すことにより解決 ンドウクラスの Create メソッドで , ウイン できます。ウインドウクラスの定義と Create ションクラスが提供する場合や , ウインド ドウを作成したあとに自身のアドレスをプ メソッドは , List 7 のようになります。 ウクラスごとに用意したりと , 方法はいろ ロバティとしてセットします。ウインドウ Xlib やツールキットプログラミングにお いろありますが , いずれにしてもユーザア の作成とウインドウブロシージャは , List 6 いても , W ⅲ dows と同様にイベントループ プリケーションからは隠蔽されるべきでし のようになります。 Windows におけるコールバック呼び出し / / ウインドウクラス class mWindow : public 基底クラス { protected : HWND -hWnd; / / ウインドウハンドル 卩 public: mWindows( 〃コンストラクタ / / ウインドウ作成 bo 引 Create ( 1 virtual void OnSize() { } / / リサイズコールバック v 辷加引 void OnPaint( ) { } / / 再描画コールバック / / ウインドウ作成 bo 引 mWindow : : Create ( ) —hWnd = CreateWindow( . SetProp(—hWnd, "mLib" this / / ウインドウブロシージャ LRESULT WINAPI WndProc(HWND hWnd, UINT Msg, . ・・ / / hWnd から mWindow のインスタンスアドレスを求める mWindow *wnd = (mwindow * )GetProp(hWnd, "mLib" switch ( Msg ) { case WM—SIZE : / / サイズ変更 wnd->OnSize(LOWORD( a て ) , HIWORD(lParam) ); return 0 ー case WM-PAINT : / / 再描画 wnd → OnPaint( . return 0 ー / / ウインドウ作成 / / プロバティ名を畆 ib として / / 自身のアドレスを登録 特集 3 クラスライブラリ作成術 73

8. 月刊 C MAGAZINE 2000年6月号

Pe プログラミング の楽しみ ームを表示します。このうち , print hidden ( -name = > mycmd' Fig. 8 猫語・赤ちゃん語 CGI( 入力フォーム ) フ′イル集表示Ⅳ ) ジャこづ市′物取 0 ヘルづ 猫語・赤ちゃん語変換 CGI 諸・寺 : : ′ : を第洋 選んでくだれ、 : を界ちゃん題 文章を入力してください : 、かしむし、あるとこうに じいさんとおはあ 3 んがすんでいました . じいさんは山へしはかリに ばあさんは川へせんたくにいきました。 Fig. 9 赤ちゃん語に変換した ファイル裏表ジャンヴ 0 朝 m “に曇 0 、′、ルプ 猫語・赤ちゃん語変換 C もとの文章 むかしむかし、あるとこうに おじいんとおばあ 3 んがすんでいました . - じいんは山へしばかりに ・ばあんま川へせんたくにいきました物 変換語の文章 むかちむかち、あるところに、 じい・んとばあちゃんがちゅんでいまちた . ・じいやんはヘちはかりに おばあちゃんは川へちえんたくにいきまちた . Fig. 10 別の文章を猫語に変換した例 フ , ル : ・影第丁 ( ンヤ : つ ( 廠に冖ヘル 猫語・赤ちゃん語変換 C 引 もとの文章 を作りな新らみれづロラ ! ングを高しんでみましよう . そのときに油主に、料 4 を優い第した季、、 , 日 . 引 ~ ! ) : ンアップきています . そこで◆月は、料ーと ( 引 . “というモジュールを優ってーの作を行ってみます . 変換語の文章 を粤リプ ; ー作りに・がら、プログラミングををしんでみましように物ん . 司ロ 物同ロ フプれていますに , ん・ には主にを・日 4 を優いし いう・をお・ナ、しましたに 0 ん . 本 0 、一物 00 年、高羡・を、 ~ , ・ & 、 0 , ・ -value = > convert という部分に注意してください。この部分 は , <INPUT TYPE= ” hidden ” NAME= ” mycmd" VALUE=' というタグに変換されます。 convert ” > います。変換先の漢字コードは変数 Skanji ここでは jcode. pl の関数 conve れを使って &jcode' convert( * msg, $kanjicode) ; にしています。 変換をする前に漢字コードをシフト JIS ださい。 ます。このあたりは好みで修正してみてく 「ちよ」に変換して , 赤ちゃんふうにしてい 「そ」をそれぞれ「ちゃ」「ち」「ちゅ」「ちえ」 同様に & a ize では「さ」「し」「す」「せ」 い ( ? ) 言葉遣いにしています。 があったら「にゃん。」に変換して , 猫つば 「にや」「にゆ」「によ」に変換し , さらに「。」 & nekoize では「な」「ぬ」「の」をそれぞれ 〇 &nekoize , &akatyanize 行われます。 ん語用の処理 (&akatyanize) とに分かれて じて , 猫語用の処理 (&nekoize) と赤ちゃ 変換処理は , param( mytype') の値に応 れた文字列はそのまま表示されます。 数はく PRE> く /PRE> タグを生成し , 入力さ 文章を pre 関数を使って表示します。 pre 関 &do_convert では , 元の文章と変換後の 〇 do_conve 「 t 与えることになります。 に対して「変換処理を行う」という指示を このタグを埋め込むことで , nekol. cgi PU やタグ同様にデータが送られます。 フォームを送信したときにはほかの <IN このタグは画面には表示されませんが , code で指定しています。 こで指定する TabIe 3 List 4(nek01. cgi ) で使っているフォームデータ 指定する内容 mycmd mymsg mytype 意味 conve 「 t ならば「変換処理を行う」それ以外なら「入力フォームを表示」 変換する元の文字列 「猫語」に変換するか「赤ちゃん語」に変換するかを指定する 漢字コードはスクリプト nekol. cgi そのも のの漢字コードに合わせる必要がありま す。たとえばスクリプトがシフト JIS なら ば $kanjicode の値も 'sjis' にしておきます。 スクリプトが日本語 EUC ならば $kanjicode の値も 'euc' にしておきます。スクリプト に埋め込まれている表示文字列と , フォー ムデータからやってきた表示文字列の漢字 ・修正箇所その 2 use Jcode, ↓ require jcode. pl' ・ ・修正箇所その 1 下のように修正してください。 もしも , Jc 。 de. pm を使う場合には , 以 てしまうからです。 コードが違っていると , 文字化けを起こし ↓ &jcode' convert( * msg, $kanjicode) ; http://www.hyuki.com/mp/ 助かります。本連載に関する U 糺は , 題に [MP] という文字を含めてくださると りください。本連載に関するメールには表 結城浩 <hyuki@hyuki.com/ へメールをお送 せくだされば幸いです。また , ご遠慮なく 本誌綴じ込みの編集部へのハガキでお知ら もしも , ご意見やご質問がありましたら , 待ください。 POD を紹介してみましよう。どうぞご期 使われているドキュメントシステムである 次回は「 POD の楽しみ」と題して , perl で http://www.hyuki.com/cgib00k2/ http://www.hyuki.com/cgibook/ ください。 る CGI 入門』の基礎編・応用編を参照して て基礎から学びたい方は , 拙著『 Perl で作 てみました。いかがでしたか。 CGI につい 今回は簡単な CGI プログラミングを行っ 次回は「 POD の楽しみ」 Jcode::convert (%$str, $kanjicode) ; です。 Perl プログラミングの楽しみ 97

9. 月刊 C MAGAZINE 2000年6月号

プログラミングレッスン 3 a 言語 マ早クーー、 言語を始めよ のような修飾子を導入するのです。この修 にも vola ⅱ le があるではありませんか ! そ 飾子の意味は , 「この変数に関しては最適化 うだよなー なんといっても Java 言語のべ コンパイルをしてもよい / してください」と ースは C / C + + だから , あって当然か・・・・・・ いう指示です。あるいは javac/java に最適化 というわけで , 今回の Java の空文の一件 オプションがあってもよいでしよう。今の は急転直下 , アンチクライマックスの解決 プロセッサとメモリは結構高速ですから , デ とあいなりました。 List 1 の EmptyTest.java フォルトを「最適化なし」にしても通常の実 の状態 , すなわち while 節の実行文が空文で 務アプリケーションでは目に見える性能劣 ある状態のままで , 12 行目の変数宣言 化は絶対に生じないと私は思います。 static boolean eSwitch; 最初なぜ私は , Java には volatile がないと を次のように書き換えます。 いう印象でいたのか ? それは , 「 Java は C/ static VO は 1 ⅱ e boolean eSwitch; たったこれだけのことで , めでたく黄色 C + + に比べるとずっと高級な高級言語です から , プログラマに低レベルな注意力を要 いボタンはピンクのボタンへと変わってく 請するような仕組みはもはや存在しないは れるのであります。 、の言語を語めよう a 言語プロ ? ラミイグレッス / 上 ) ずである」という漠然とした気持ちでいたか 問題はあっけなく解決。こうしても jav 叩 らですね。しかもスレッドやイベントハン の出力は前とまったく同じですから , volatile 結城浩犀るプゴグちミゾツネ心名あ ドラをフル活用する Java 言語では , 「この変 への対応は Java バイトコード (JVM の命令 ) = 年めのし語人門書。本を ( 上巻 ) ま、 の知識や経験のない初心者 数がどこかよそで変えられている / 使われて →実プロセッサの実行コードという翻訳過 いるかも知れへん = 最適化はバグにつなが 程で行われていることが明らかです。 る」という状況が非常に多くなっています。 でもなぜ , non-static メソッドや static メ ソッドでもほかのクラスのメソッドの場合 言い換えると C で volatile を使わなくては ならないような特殊な場面が , Java ではど には , この最適化を免れてしまうのか ? ちらかというと一般的な場面です。それに それはおそらく , VMC の実装において , また , いくらコンパイラの知能に限界があ これらのケースでは , 変えられていないよ うに見える変数でも呼ばれたメソッドの中 るといっても , while( ! f00 ) で変えられているかも知れへんから最適化 みたいな節があれば「この f00 の値はいつか せんでおこう , という知恵が働いているの づら どこかで・・・・・・ソース面からは見えない場所 でしよう。 で・・・・・・変えられるのだな」と子どもでも判断 しかしですね , と私はここで声を大にし できるでしよう。変わりうるからこそ , while て言いたい。そもそもプログラムを書いて の条件式になっているわけですよ ! だか 「この変数は volatile にしとか いくときに ら小賢しく最適化をせずに , ループの毎回 んとやばいな」ということを , いちいち , 正 で f 。。を律儀に馬鹿正直にフェッチすべき 確に判断するのはたいへんです。実務プロ なのです。 グラマにそこまで細かい低レベルの注意を 「 Java ではデフォルトで最適化なしにせよ』 求めるのは , 酷であります。 C 言語の経験 という主張には , もちろん賛否両論がある や , オプティマイジングコンパイラの問題 でしよう。でも実務プログラミングにおけ 点に関する知識のない , プログラミングに るユーザプログラミング / ビジネス現場プロ →新から入った初心者プログラマにと Java ロロロ グラミングのすそ野を Java によって拡大す っては , これは尚更のことです。 るためには , 「楽屋裏におけるコンパイラの ですので言語の設計 / 実装方式としては , 仕事ぶりのような , 低レベルの知識や低レ 「デフォルトでは最適化をしない』を貫くの ベルへの注意は要らない」が絶対的な条件 が正解ではないでせうか ? そして vola ⅲ e であるはずです。 とは逆に , 経験豊富なべテランプログラマ そしてむしろ , 最適化をプログラマが必 のための修飾子として , たとえば nonvolatile B5 変 376 ページ ISDN 4-7973-0803-6 本体価格 2,400 円 4 ~ 言語 プロクラミンク をレッスン 0 「ツら羡クトめ 版出劵 オプジクト指向を始めよう Ja 言語プログラミングレッスン ( 下 ) 結城浩著 結城浩によプ朝ツラミング初心者のための ・ Java 言語入門書体書て下巻 ) 、ではぐ上巻 の知識を踏まえ、クラス、クラスの継承例外 , ′スレッド、バヅケツなど、オブジェクト指向 の概念を、多くのサンプルプログラムを使って、 明快に解説しているいーこ B5 変 344 ページ ISDN 4-7973-1 OI 0-3 本体価格 2400 円 好評発売中 ! SOFT ソントバングバブリッシング株式会 BANK 物れP://b00トS. softbank. c 0. jp/ ublishing EL : 03-5642- 白 T00 ~ 示価格は税別 ) C 言語フォーラム 139

10. 月刊 C MAGAZINE 2000年6月号

「 = 」は比較演算子で「 A と B は同じである」 という意味です。数学の教科書のなかに出 てくる「 = 」と同じ意味なのですが , C 言語で は代入操作を表す記号 ( 演算子 ) として「 = 」 が使われているので「 = = 」になっています。 C 言語の文法上 , 「 = 」と「 = = 」を間違えて用い ていてもコンパイルできてしまいます。慣 れないうちは比較演算子の意味で「 = 」と書 いてしまうことが多いので , 注意してくだ 「 ! = 」は「 A と B は同じでない」という意味で , 数学では「半」と表記されます。 ( 数学では「」 ) といった比較演算子群は , A と B の大小関係を評価します。 ブール代数 1854 年 , イギリスの George Bo 引 e は , そ の後の数学に一分野を築き , コンピュータ の発明とは切っても切り離せないひとつの 提案を行います。それは論理学と代数学を 結び付けた , 論理を数式で扱える体系 , ブ ール代数の提案でした。 それまで数値を扱うための計算理論であ った代数学を拡張し , 真と偽の 2 値を持つ 命題を扱う論理学を数学の世界に取り込ん だのです。ブール代数によって , 論理学で 扱われる推論を数式で表現できるようにな り , 論理の演算が行えるようになりました。 現在 , インテリジェントに振る舞うソフト ウェアがたくさんありますが , 最初に科学 的に知性にアプローチしようとしたのがプ ール代数だったといえるかもしれません。 日本の数学教育のなかでは , 集合論とし て代数学教育に組み込まれています。コン ピュータを支えている数学理論としてはた いへん重要な分野のひとつなのですが , 我 が国では ( 受験 ) 数学の主流から外れている こともあり , あまり熱心に教えられてはい ないようです。プログラミングを志す人に は , ぜひとも押さえておいてほしい知識な のですが・・ コラム 1 82 C MAGAZINE 2 0 6 演習 : 次の式の真偽値を求めよ。 ① 30 > 15 ② 15 = = ( 7 + 8 ) ③ ! ( 40 ! = ( 4 * 10 ) ) また標準的な C 言語の処理系では , 真偽 値を整数型の値として扱えるようになって います。真が 1 , 偽が 0 という値をとるのが 一般的です。 List 3 では , 真偽値をⅲ t 型変 数に代入しています。逆に , 数値を真偽値 として ( むりやり ) 評価することも可能で , ほとんどの C 言語処理系において 0 以外を 真 , 0 を偽として評価が行われます。 論理積 真偽値の評価に関する演算でとくに重要 視されるもののひとつが「論理積 ( and ) 」と 呼ばれる演算です。論理積はふたつの真偽 値 ( もしくは真偽値評価される式 ) A , B があ った場合 , その両方が真のときのみ , 自身 の評価値を真にします。たとえば , ( 1 > 0 ) & & ( 3 > 2 ) の式は , 「 & & 」で結ばれたふたつの項がと もに真なので , 式全体の評価も真になりま すが ( 1 > 0 ) & & ( 3 く 2 ) (1<0) & & ( 3 > 2 ) ( 1 く 0 ) & & ( 3 ) といった式の式全体の評価は , すべて偽に なります。 論理積「 & & 」は数学の集合の概念におけ る「 A かっ B 」という意味を表現しています。 演習 : 次の式の真偽値を求めよ。 ④ ( 10 > 15 ) & & ( 1 = = ( 2-1 ) ) 論理和 論理積と同様に , 真偽値の評価に関する 演算で重要視されているのが「論理和 ( or ) 」 と呼ばれる演算です。論理和はふたつの真 偽値 ( もしくは真偽値評価される式 ) A , B が あった場合 , そのいずれか一方が真であれ ば , 自身の評価値を真にします。たとえば , ( 1 > 0 ) Ⅱ ( 3 > 2 ) ( 1 > 0 ) Ⅱ ( 2 ) ( 1 く 0 ) Ⅱ ( 3 > 2 ) といった式は , 「旧で結ばれたふたつの項 のいずれか一方 ( もしくは両方 ) が真なので , 式全体の評価も真になりますが , (1<0) Ⅱ ( 3 く 2 ) の式は , ふたつの項が両方とも偽なので , 式全体の評価も偽になります。 論理和「旧は , 数学の集合の概念におけ る「 A もしくは B 」という意味を表現していま す。 演習 : 次の式の真偽値を求めよ。 ⑥ ( ! ( 30 > 15 ) 翔 ( 1 = = ( 2-1 ) ) また , List3 を参考に , 1 ~ 6 の式 の真偽値計算を行うプログラムを ビット演算 作成せよ。 同じようなイメージで , 対象となるデータ 単項演算子「 ~ 」は単項演算子「一」や「 ! 」と 一緒に , 順に見ていきましよう。 3 にまとめました。 List 4 とその実行結果と ビット演算に用いるおもな演算子を TabIe れませんね。 とえると , イメージが伝わりやすいかもし は真偽値計算のパイプライン処理だ」とた タ雑誌をよく読まれる方には「ビット演算 とができます。そう考えると , コンピュー バイトは 8 個の真偽値の集合体と考えるこ か 0 なので , これを真偽値に見立てると , 1 和が使えます。 1 ビットで表現できるのは 1 をビット単位で扱う場合にも論理積や論理 理積や論理和が使えるだけでなく , データ C 言語では , 式の真偽値計算に関して論