←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4607

ビットを落としたい
投稿者---烏龍茶(2005/09/02 20:04:20)


ビットを落とす方法が分かりません。
よろしければ教えてください。

例えば、flg = 0x1111 の 2ビット目だけを落として 0x1101 としたいのですが、
flg ^= 0x0010;
とすると、確かに flg = 0x1101 となるのですが、今度同じルートを通ると
flg = 0x1111 に戻ってしまいます。
同じ処理を行っても、一度落としたビットは明示的に設定(flg |= 0x0010)するまで落としたままにしたいのですが、
何か良い方法はないでしょうか。

プログラムで言うと、以下のコメントのようなことを行ないたいです。
#include <stdio.h>

#define A 0x0001
#define B 0x0010
#define C 0x0100

int main(void)
{
    unsigned short flg_01 = 0;
    flg_01 = A | B | C; //0x0111にセット(OK)

    flg_01 ^= B;    //処理A:2ビット目を落とし0x0101とする(OK)
    flg_01 ^= C;    //処理B:3ビット目を落とし0x0001とする(OK)
    flg_01 ^= B;    //処理C:2ビット目が元に戻り0x0011となってしまう(NG)
                    //  ↑2ビット目そのままで0x0001としたい。

    printf("flg_01 = 0x%.4x\n");

    return(0);
}

ここで、処理Aと処理Cは同じにしたいのですが、if文で分岐させるしかないでしょうか。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ビットを落としたい 4608 NykR 2005/09/02 20:19:01


No.4608

Re:ビットを落としたい
投稿者---NykR(2005/09/02 20:19:01)


>ビットを落とす方法が分かりません。
>よろしければ教えてください。
>
>例えば、flg = 0x1111 の 2ビット目だけを落として 0x1101 としたいのですが、

0x1111の2ビット目を落とすと、結果は0x1111ですが・・・。

>flg ^= 0x0010;

flg &= ~0010binary; // 参考 http://forums.belution.com/ja/cpp/000/011/57s.shtml


この投稿にコメントする

削除パスワード

No.4609

Re:ビットを落としたい
投稿者---烏龍茶(2005/09/02 21:28:47)


>>ビットを落とす方法が分かりません。
>>よろしければ教えてください。
>>
>>例えば、flg = 0x1111 の 2ビット目だけを落として 0x1101 としたいのですが、
>
>0x1111の2ビット目を落とすと、結果は0x1111ですが・・・。

いゃん。


>>flg ^= 0x0010;
>
>flg &= ~0010binary; // 参考 http://forums.belution.com/ja/cpp/000/011/57s.shtml

ありがとうございました。
flg &= ~B;
で目的の結果を得ることができました。
参考ホームページは少し難しそうですが、がんばって見てみます。



この投稿にコメントする

削除パスワード

No.4610

Re:ビットを落としたい
投稿者---chu-(2005/09/04 01:36:22)


>flg &= ~0010binary; // 参考 http://forums.belution.com/ja/cpp/000/011/57s.shtml

それとは違う2進数表記のアイデアを依然見たことがあります。
記憶からソースを起こしてみましたが微妙に異なるかも。

でも2進数だと桁が増えて逆に読みにくくなる可能性がありますね。
16進数のビットパターンを丸暗記してしまうのが結局いいのかも?

[test.c]
#include <stdio.h>

#define BIT_(x,n) ((((0x##x)>>(n*4))&1)<<n)
#define B(x) (BIT_(x,7)|BIT_(x,6)|BIT_(x,5)|BIT_(x,4)|BIT_(x,3)|BIT_(x,2)|BIT_(x,1)|BIT_(x,0))
#define W(x1,x0) ((B(x1)<<8)|B(x0))
#define L(x3,x2,x1,x0) ((W(x3,x2)<<16)|W(x1,x0))

int main(void)
{
    unsigned char  b = B(01111111);
    unsigned short w = W(00111111,00011111);
    unsigned long  l = L(01111111,00111111,00011111,00001111);

    printf("b:%02X w:%04X l:%08lX\n", b, w, l);

    b &= ~B(00001000);
    w &= ~W(00001100,00001110);
    l &= ~L(00001000,00001100,00001110,00001111);

    printf("b:%02X w:%04X l:%08lX\n", b, w, l);

    return 0;
}

[実行]
プロンプト>lcc test

プロンプト>test
b:7F w:3F1F l:7F3F1F0F
b:77 w:3311 l:77331100

プロンプト>



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity