スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

bitとかフラグとか

さてそれなりに長い間Java専門でやってきましたが、

幸いにもbit演算をするようなプロジェクトはありませんでした(あったような気もするけど直接関係無かった)

もうすこしJava的にやろうぜい!と。

最近だったらenumとEnumSetだし、一昔前だったら定数とSetといった感じでしょうか


だが、いかんせんandroidだとあまり意識はしなくてもちょいちょいとbit演算が出てきてたりします。

というわけでまとめ。


フラグ(bit)の定義

public static final int GREEN = 1 << 0;
public static final int RED = 1 << 1;
public static final int BLUE = 1 << 2;

こんな感じで、シフトを利用して定義するのが可読性がいいと。

本当ですか?なんて思いもありますが、そもそも、パフォーマンスとしてフラグを利用するくらいなら

素直に値で定義した方がいいんじゃないでしょうか。本末転倒。って気もします。


続いてフラグのON(立てる場合)

option |= flg;

フラグをOFF(落とす場合)

option &= ~flg;

フラグがたっている事を確認する場合

  public boolean isFlagOn(final byte flg) {
    return (option & flg) != 0;
  }

で、適当な動作はこんな感じかな。

一応intではなく、byteでやってますけど。


public class BitSample {
  public static final byte SOUD_ON = 1 << 0;
  public static final byte LED_ON = 1 << 1;
  public static final byte VIB_ON = 1 << 2;
  
  private byte option = 0;
  
  public static void main(String[] args) {
    BitSample opt = new BitSample();

    System.out.println("SOUND BIT : " + SOUD_ON);
    System.out.println("LED BIT : " + LED_ON);
    System.out.println("VIB BIT : " + VIB_ON);
    
    printFlags(opt);
    System.out.println("LED ON");
    opt.on(LED_ON);
    
    printFlags(opt);
    
    System.out.println("LED OFF");
    opt.off(LED_ON);
    printFlags(opt);
    
    System.out.println("LED 再度OFF(反転では無いことを確認)");
    opt.off(LED_ON);
    printFlags(opt);
  }

  private static void printFlags(BitSample opt) {
    System.out.println("SOUND : " + opt.isFlagOn(SOUD_ON));
    System.out.println("LED : " + opt.isFlagOn(LED_ON));
    System.out.println("VIB : " + opt.isFlagOn(VIB_ON));
  }
  
  public boolean isFlagOn(final byte flg) {
    return (option & flg) != 0;
  }
  
  
  public void on(final byte flg) {
    option |= flg;
  }
  
  public void off(final byte flg) {
    option &= ~flg;
  }
}

表示はこんなん

SOUND BIT : 1
LED BIT : 2
VIB BIT : 4
SOUND : false
LED : false
VIB : false
LED ON
SOUND : false
LED : true
VIB : false
LED OFF
SOUND : false
LED : false
VIB : false
LED 再度OFF(反転では無いことを確認)
SOUND : false
LED : false
VIB : false

詳しい人突っ込みお願いします。

追記

値として定義するような場合、16進表記にすると、0,1,2,4,8ですべてをまとめられるので便利みたいですよ。

0x0001 -> 1bit

0x0002 -> 2bit

0x0004 -> 3bit

0x0008 -> 4bit

0x0010 -> 5bit

0x0020 -> 6bit

0x0040 -> 7bit

0x0080 -> 9bit

関連記事

コメントの投稿

非公開コメント

スポンサードリンク
アプリ一覧
最新記事
最新コメント
最新トラックバック
検索フォーム
月別アーカイブ
カテゴリ
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。