コグノスケ


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 26年7月14日
    hdkさん (07/22 08:37)
    「冷却水漏れなんて、修理するまでは補充して...」
  • link 26年1月23日
    すずきさん (01/29 09:48)
    「おおー、そんな昔からなんですね。歴史感じ...」
  • link 26年1月23日
    hdkさん (01/27 19:53)
    「#! はUNIX v8からだったってWi...」
  • link 24年12月9日
    すずきさん (01/18 15:45)
    「Thank you for your i...」
  • link 24年12月9日
    Up2Uさん (01/15 12:57)
    「Hi I also find the p...」

最近の記事20件

  • link 23年5月15日
    すずき (07/22 03:04)
    「[車 - まとめリンク] 目次: 車三菱 FTO GPX '95の話。群馬県へのドライブ1群馬県へのドライブ2将来車を買い替え...」
  • link 26年7月22日
    すずき (07/22 03:04)
    「[ジャガーさんの冷却水漏れの修理見積もり] 目次: 車先週、冷却水がほぼなくなってしまい修理工場にレッカーしたジャガーさんです...」
  • link 26年7月14日
    すずき (07/22 02:37)
    「[ジャガーさんの冷却水漏れ] 目次: 車朝、出勤しようと思ってエンジンをかけたところ冷却水不足と表示されました。わぁ、ついに出...」
  • link 26年7月19日
    すずき (07/20 04:04)
    「[ゲームを買ったら遊びましょう4] 目次: ゲーム前回の振り返り(2025年12月22日の日記参照)から半年経ちました。Swi...」
  • link 21年12月28日
    すずき (07/20 04:03)
    「[ゲーム - まとめリンク] 目次: ゲームNintendo DSを買ったパネルでポンDS最近の朝はパネポンDS聖剣伝説DSチ...」
  • link 26年7月13日
    すずき (07/19 23:33)
    「[Flightradar24のcontributorになる方法] 目次: 自宅サーバーADS-Bを受信できる環境があればFli...」
  • link 23年6月1日
    すずき (07/19 23:31)
    「[自宅サーバー - まとめリンク] 目次: 自宅サーバーこの日記システム、Wikiの話。カウンターをPerlからPHPに移植日...」
  • link 23年9月11日
    すずき (07/15 12:18)
    「[Windows - まとめリンク] 目次: WindowsWindows XPのブリッジ機能colinuxとWindowsの...」
  • link 25年1月31日
    すずき (07/15 12:18)
    「[Windowsの日本語フォントはみな長生き] 目次: WindowsGNOME48からフォントが変わるニュースを見ていて、フ...」
  • link 26年7月11日
    すずき (07/12 01:26)
    「[Timberborn、トロフィーコンプ] 目次: ゲームTimberbornのトロフィーをコンプリートしました。アーリーアク...」
  • link 24年2月7日
    すずき (07/11 13:05)
    「[複数の音声ファイルのラウドネスを統一したい] 目次: PythonPCやデジタル音楽プレーヤーで音楽を聞いていると、曲によっ...」
  • link 26年6月27日
    すずき (07/08 01:45)
    「[ジャガーさんのバンパー修理] 目次: 車以前(2025年11月21日の日記参照)、ジャガーさんの左前をぶつけてバンパーをガリ...」
  • link 26年7月3日
    すずき (07/08 00:42)
    「[ADS-Bを受信して飛行機の位置を見よう] 目次: 自宅サーバー空を飛ぶ飛行機は離陸直後や着陸寸前でもない限り飛んでいる姿は...」
  • link 26年7月1日
    すずき (07/04 02:37)
    「[GPSは世界一正確な時計、その3 - ntpsecとgpsd] 目次: 自宅サーバー以前(2015年5月8日の日記参照)、G...」
  • link 26年6月26日
    すずき (07/03 05:23)
    「[ジャガーさんの不思議なシフト] 目次: 車ジャガーXE(前期型)はシフトがダイヤル型になっていて、P, R, N, D, S...」
  • link 20年2月22日
    すずき (06/26 02:03)
    「[Zephyr - まとめリンク] 目次: Zephyr導入、ブート周りHello! Zephyr OS!!Hello! Ze...」
  • link 26年6月18日
    すずき (06/26 02:02)
    「[ZephyrのOut-of-treeアプリケーションその6 - シリアル出力] 目次: Zephyr前回はシリアルに文字を出...」
  • link 26年6月23日
    すずき (06/26 01:27)
    「[ANA国内線予約サイトが悲惨なことに] 4月くらいにANAの国内線予約サイトが国際線と共通のクラウドシステム(Amadeus...」
  • link 26年6月11日
    すずき (06/26 01:10)
    「[ZephyrのOut-of-treeアプリケーションその5 - OpenOCDとGDBで実行] 目次: Zephyr前回Ze...」
  • link 26年4月29日
    すずき (06/24 01:10)
    「[ぽこあポケモンをクリア] 目次: ゲーム1日だけやって放置していたぽこあポケモンをクリア(=スタッフロールが流れるイベントを...」
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 2026年
open/close 過去日記について

その他の情報

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

合計:  counter total
本日:  counter today

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

最終更新: 07/22 08:37