コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2009年3月22日 >>> 2009年3月9日
link もっと後

2009年3月22日

Javaでビットフィールドはできなさそう

目次: Java

今日はJavaでビットフィールドを扱う方法を探していたのですが、やり方がわかりません。

ビットフィールド(C言語)

#include <stdio.h>

union u {
        char c;
        struct _s {
                unsigned a:2;
                unsigned b:4;
                unsigned c:2;
        } s;
};

int main(int argc, char *argv[])
{
        union u v;

        v.s.a = 1;
        v.s.b = 0;
        v.s.c = 1;
        printf("v.c=%d(0x%x), v.s.b=%d(0x%x)\n",
                v.c, v.c, v.s.b, v.s.b);
        v.s.b = 10;
        printf("v.c=%d(0x%x), v.s.b=%d(0x%x)\n",
                v.c, v.c, v.s.b, v.s.b);

        return 0;
}

Cだと上記のように構造体風に書けるんですが、Javaだとどうすりゃいいんだろか。今は仕方ないのでシフトとビット演算でえっちらおっちら書いています。

シフトとビット演算

目的はある下位ビット(stビット目とする)からある上位ビット(edビット目とする)を占めるビットフィールドを抜き出すことです。これはビットフィールドの書き換え、つまり上記のCでいうところのv.s.b = 10; のような処理をしたいときに必要です。

もう一つの目的はビットフィールドに入っている値を得ることです。これはビットフィールドを読み取り、つまりprintf("%d", v.s.b); のような処理をしたいときに必要です。

まずstビット以上を1で埋めたパターン(パターンAとする)を作ります。
作り方: 1をstビット左シフトして1を引くと、stビットより下が1で埋まったパターンが得られますので、そのパターンをビット毎NOTをするとパターンAが得られます。

次にedビット以下を1で埋めたパターン(パターンBとする)を作ります。
作り方: 1をedビット左シフトして1を引くと、edビットより下が1で埋まったパターンが得られます。そのパターンに1をedビット左シフトした値をビット毎ORすると、パターンBが得られます(※)。

パターンAとパターンBのビット毎ANDを取ると、stビットからedビットまでが1で埋まったマスクが得られます。

ビットフィールドを保持している値とマスクをビット毎ANDすると、目的のビットフィールド以外を0で潰した値が得られます。

ビットフィールド内の値を得たい場合は、パターンBだけビット毎ANDして、その後stビット論理右シフトします。パターンAをANDしなくても結果は同じです。


ビットフィールド

例としてst = 2, ed = 5の状態を図示すると上記のようになります。

おそらく「何やってるんですかJavaなら○○で一発ですよ!」ってオチがある気がしてならないので、もっと良いやり方があったらぜひ教えてくださいまし。

(※)1をed + 1ビット左シフトして1を引く方法は正常に計算できない場合があります。edと変数のビット長が等しい場合、(変数のビット長 + 1) ビットの左シフトが起きます。CやJavaでは変数のビット長を超える左シフトの結果は不定のため、得られるパターンも不定となります。

編集者:すずき(2025/01/14 01:10)

コメント一覧

  • すずきさん(2011/03/03 09:27)
    間違っていたので訂正。
    Javaでビット長を超える左シフトの結果は不定ではなく、シフト量の下位数ビットのみ有効になる、が正解です。

    intに対する左シフトの場合は下位5ビット、つまり0〜31まで、
    longに対する左シフトの場合は下位6ビット、つまり0〜63までシフトできます。
    例を挙げると、intに対する32ビットシフト=0ビットシフトです。

    参考: Java Language Specification, Third Edition, chapter 15(expressions), 15.19 Shift Operations
open/close この記事にコメントする



2009年3月16日

コンシューマ機の宿命

昨日の日記のお母さんのコメント「DSはもう少し画面が大きいと良いのに。」を見てふと思ったこと。

先日発売された新型機DSiでは画面が少し大きくなりました。ということは任天堂は画面が小さいという問題を認識していて、改善する意志もあるんです。なのにもっと画面を大きく(例えば倍くらい)できないのはなぜ?

あまりでかいと持てない、など理由は色々あると思いますが、大きな理由は初代DSやDS Liteと同じ環境を保つため、でしょう。

環境を保つと何が嬉しいかというと、初代DSで遊べるゲームが新型機のDS LiteやDSiでも遊べるようになります。逆に環境を保たないと、新型機で性能や機能(画面サイズなど)を変えると、過去のゲームが破綻して遊べなくなってしまいます。

より良く変えることが出来るのに、変えられない…新型機で過去のゲームが遊べることは当たり前に見えて、結構大変なのです。

5年持つスペック

ゲーム機は一度流行れば5年は持ちますから、基本となる初代機のスペック決めは非常に重要です。とはいっても、5年間使われるスペック決めってどうやるんですかね?相当難しいよね?

編集者:すずき(2009/03/23 00:49)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2009年3月15日

誕生日

大下さんと2人でハンドミキサーを買いに行きました。ヨドバシのポイントだけで買えてしまいました。思いのほか安かった。

いつぞやメレンゲを泡立てるのは大変という話をしていたので選んだつもりでしたが、大下さんは「お菓子を作って俺に喰わせろ。」という意味だと思っていたようです。とりあえずお菓子を作ってくれることには変わりないです。

誕生日特典を利用して、京831(やさい)倶楽部(大阪市西梅田、ブリーゼタワー5F)のコースを格安で。名前の通り野菜がメインでうまいです。タケノコが甘いなんて初めて知った。

テーブル上にろうそくがあり、料理が出てくる合間にいたずらしていたら、ろうそくの芯が折れて火が消えてしまいました。ご迷惑かけました…。

オーキードーキー

ニンテンドーDSiを買いました。個人的にはWPA-PSK(AES/TKIP) に対応しているのがグッド。

カメラは何に使うか良くわかりません。面白いかどうかは別として、カメラとWi-Fiとマイクがあるので、ゲーム+テレビ電話(上画面に人、下画面に対戦画面)ができそうですね。いよいよ携帯電話と携帯ゲーム機の垣根が低くなってきたなあ。

ゲームもついでに買いました。マリオ&ルイージRPG 3です。Aでマリオを動かして、Bでルイージを動かします。操作は簡単なのにタイミングがよくわからず、しょっちゅう押し間違えて敵にボコボコにされます。

編集者:すずき(2009/03/16 22:29)

コメント一覧

  • mamaさん(2009/03/18 10:18)
    DSおもしろいねぇ〜
    すっかりはまってます。私は推理物ですが、画面がもちょっと大きいといいのにな。
  • すずきさん(2009/03/22 17:52)
    確かにもう少し画面が大きい方がいいです。細かい字が見えません。
open/close この記事にコメントする



2009年3月10日

誕生日

誕生日を祝っていただきました。皆様ありがとうございます。

今まで30歳になるなんて考えたこと無かったけど、30歳はもうすぐなんだよなあ…。

編集者:すずき(2009/03/11 23:38)

コメント一覧

  • やましたさん(2009/03/12 21:24)
    一瞬、いつの間にか30歳になってしまったのかと思ってびっくりしたよ。おめでとうございましたー。
  • すずきさん(2009/03/16 21:39)
    >やましたさん
    ありがとうございます。30歳の誕生日も今日と同じようなことを書いてしまいそうな気がします。
  • mamaさん(2009/03/18 10:16)
    やましたさんに1票!
    息子の年を忘れてしまったかと、頭が真白になってしまいました。
    四捨五入すると・・・ってことね。する必要性はかんじないけど。
  • すずきさん(2009/03/22 17:46)
    四捨五入だと去年から既に 30 になってしまうので、関係ないです。
    単に「30歳はすぐそこだなあ。」と思っただけです。
open/close この記事にコメントする



link もっと前
2009年3月22日 >>> 2009年3月9日
link もっと後

管理用メニュー

link 記事を新規作成

<2009>
<<<03>>>
1234567
891011121314
15161718192021
22232425262728
293031----

最近のコメント5件

  • link 25年10月6日
    すずきさん (10/10 13:14)
    「ですね。ccはもはやコンパイラというより...」
  • link 25年10月6日
    hdkさん (10/10 08:27)
    「ただのHello, worldでも試して...」
  • link 25年9月29日
    すずきさん (10/03 00:29)
    「なんと、メタパッケージ入れてなかったです...」
  • link 25年9月29日
    hdkさん (10/02 06:51)
    「あれ、dkmsは自動ビルドされるのが便利...」
  • link 20年8月24日
    すずきさん (08/30 22:06)
    「ですね、自分も今はPulseAudioを...」

最近の記事20件

  • link 22年12月13日
    すずき (10/14 01:10)
    「[独自OS - まとめリンク] 目次: 独自OS自作OSの紹介その1 - 概要自作OSの紹介その2 - デザイン何もない組み込...」
  • link 20年10月23日
    すずき (10/14 01:10)
    「[ROCK64/ROCKPro64 - まとめリンク] 目次: ROCK64/ROCKPro64ROCK64ブート周りの話のま...」
  • link 21年6月18日
    すずき (10/14 01:10)
    「[RISC-V - まとめリンク] 目次: RISC-VSiFive社ボードの話、CoreMarkの話のまとめ。RISC-V ...」
  • link 20年9月6日
    すずき (10/14 01:09)
    「[FreeRTOS - まとめリンク] 目次: FreeRTOSFreeRTOSで遊ぼう その1 - FreeRTOS入門Fr...」
  • link 23年9月18日
    すずき (10/14 01:08)
    「[一覧の一覧 - まとめリンク] 目次: 一覧の一覧OS、アーキテクチャ系。目次: Android目次: Arduino目次:...」
  • link 23年6月2日
    すずき (10/14 01:08)
    「[Arduino - まとめリンク] 目次: ArduinoM5Stackとesp32とArduinoM5Stamp C3のA...」
  • link 23年4月10日
    すずき (10/10 01:20)
    「[Linux - まとめリンク] 目次: Linuxカーネル、ドライバ関連。Linux kernel 2.4 for ARMが...」
  • link 25年10月6日
    すずき (10/10 01:19)
    「[makeのデフォルトルールのリンクはLDを使わない] 目次: LinuxMakefileの達人には常識かもしれませんが、ma...」
  • link 09年11月3日
    すずき (10/09 23:58)
    「[Automakeの出力を簡潔化する方法がわからない] 目次: Linux最近はMakefileを自作せずに、GNU Tool...」
  • link 18年7月2日
    すずき (10/09 23:56)
    「[libtoolが見つからないときの謎エラー] 目次: LinuxRaspberry Pi 3を持っているのですが、あまり速く...」
  • link 15年12月27日
    すずき (10/09 23:55)
    「[GNU autotools入門 その2] 目次: LinuxGNU autotoolsは簡単なんですが、使い始めるまではかな...」
  • link 15年12月26日
    すずき (10/09 23:55)
    「[GNU autotools入門 その1] 目次: Linuxソースコードのビルドシステムは多々あって決定打はない(個人的には...」
  • link 19年9月17日
    すずき (10/09 23:54)
    「[makeは環境変数とmake変数の挙動が違う] 目次: Linuxシェルからmakeに渡す環境変数とmake変数の関係を知ら...」
  • link 09年4月8日
    すずき (10/09 23:53)
    「[同じ環境のPC2台なのにsedのビルド成功/失敗が変わる?] 目次: Linuxサーバでプログラムをmakeすると、挙動が違...」
  • link 15年12月28日
    すずき (10/09 23:50)
    「[GNU autotools入門 その3] 目次: LinuxGNU autotoolsの話を書いていて思い出したのですが、a...」
  • link 19年10月14日
    すずき (10/09 23:50)
    「[linux-nextでdirtyがバージョン情報に付く仕組み] 目次: LinuxLinuxというかlinux-nextです...」
  • link 15年6月3日
    すずき (10/09 23:49)
    「[ビルド高速化ツールccache] 目次: Linux巨大なプロジェクト(Androidなど)をコンパイルするときに欠かせない...」
  • link 15年6月5日
    すずき (10/09 23:49)
    「[バージョン管理システムとmakeの相性] 目次: Linux前々から感じていたのですが、この2者は非常に相性が悪いと思います...」
  • link 25年10月4日
    すずき (10/06 02:52)
    「[Linuxのprocファイルシステムの実装 - /proc/pid/ioのopenとread] 目次: Linux以前、Li...」
  • link 25年2月19日
    すずき (10/05 22:30)
    「[LinuxのI/O統計情報が読めないプロセスの謎を追う] 目次: Linux前回はsystemd --userの/proc/...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 10/14 01:10