今日はJavaでビットフィールドを扱う方法を探していたのですが、やり方がわかりません。
#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では変数のビット長を超える左シフトの結果は不定のため、得られるパターンも不定となります。
昨日の日記のお母さんのコメント「DSはもう少し画面が大きいと良いのに。」を見てふと思ったこと。
先日発売された新型機DSiでは画面が少し大きくなりました。ということは任天堂は画面が小さいという問題を認識していて、改善する意志もあるんです。なのにもっと画面を大きく(例えば倍くらい)できないのはなぜ?
あまりでかいと持てない、など理由は色々あると思いますが、大きな理由は初代DSやDS Liteと同じ環境を保つため、でしょう。
環境を保つと何が嬉しいかというと、初代DSで遊べるゲームが新型機のDS LiteやDSiでも遊べるようになります。逆に環境を保たないと、新型機で性能や機能(画面サイズなど)を変えると、過去のゲームが破綻して遊べなくなってしまいます。
より良く変えることが出来るのに、変えられない…新型機で過去のゲームが遊べることは当たり前に見えて、結構大変なのです。
ゲーム機は一度流行れば5年は持ちますから、基本となる初代機のスペック決めは非常に重要です。とはいっても、5年間使われるスペック決めってどうやるんですかね?相当難しいよね?
大下さんと2人でハンドミキサーを買いに行きました。ヨドバシのポイントだけで買えてしまいました。思いのほか安かった。
いつぞやメレンゲを泡立てるのは大変という話をしていたので選んだつもりでしたが、大下さんは「お菓子を作って俺に喰わせろ。」という意味だと思っていたようです。とりあえずお菓子を作ってくれることには変わりないです。
誕生日特典を利用して、京831(やさい)倶楽部(大阪市西梅田、ブリーゼタワー5F)のコースを格安で。名前の通り野菜がメインでうまいです。タケノコが甘いなんて初めて知った。
テーブル上にろうそくがあり、料理が出てくる合間にいたずらしていたら、ろうそくの芯が折れて火が消えてしまいました。ご迷惑かけました…。
ニンテンドーDSiを買いました。個人的にはWPA-PSK(AES/TKIP) に対応しているのがグッド。
カメラは何に使うか良くわかりません。面白いかどうかは別として、カメラとWi-Fiとマイクがあるので、ゲーム+テレビ電話(上画面に人、下画面に対戦画面)ができそうですね。いよいよ携帯電話と携帯ゲーム機の垣根が低くなってきたなあ。
ゲームもついでに買いました。マリオ&ルイージRPG 3です。Aでマリオを動かして、Bでルイージを動かします。操作は簡単なのにタイミングがよくわからず、しょっちゅう押し間違えて敵にボコボコにされます。
誕生日を祝っていただきました。皆様ありがとうございます。
今まで30歳になるなんて考えたこと無かったけど、30歳はもうすぐなんだよなあ…。
大下さんとラーメン博物館こと「インスタントラーメン発明記念館(池田市)」に行きました。ここでは日清のラーメン開発、発明秘話を見ることが出来ます。
それとインスタントラーメンを作る体験コーナーが大人気です。おそらくほとんどの来場者が、この体験コーナー目当てに来ていると思われます。
カップ麺(カップヌードル)と袋麺(チキンラーメン)の2つの体験コーナーがありますが、チキンラーメンは予約が必要なのでまた今度。今回はカップヌードルに挑戦しました。予約は不要で300円払えば作れます。
まず自販機でカップを買います。ここで300円払えば、後はお金を払う必要はありません。
その辺で売っているカップヌードルの入れ物と似ていますが、書いてある文字がちょっと違います。
係の人から手を消毒せよと言われます。これから食べ物を扱うわけですから、素直に従いましょう。
買ったカップはほとんど真っ白で何も模様が入っていないので、自分でカップに絵を描きます。描くのに夢中で写真撮り忘れたな…。余白に大下さんが色々描いてくれました。
係の人にカップを渡すと麺入れ機にカップをセットしてくれます。あとはハンドルをグルグル回すとカップに麺がスポッと入ります。前に並んでいた子供が大喜びしていました。
係の人に入れたい具材(4つまで)と、スープの味(ノーマル、シーフード、カレー、塩)を伝えて、具を入れてもらいます。市販と同じ組み合わせでは面白くありませんから、市販では有り得ない変な組み合わせを試すべきでしょう。
私はノーマルスープにカマボコ全種類+ネギにしました。味がなさそうだなあ…。
フタをしてシュリンク包装する(薄いビニールでぴったり包む)と、市販のカップヌードルとほぼ同じ姿になります。
仕上げとして風船みたいなバッグにカップ麺を入れて、空気入れで膨らませてやります。せっかく作ったカップ麺の中身が壊れないように配慮されています。
上のフタは市販品と見分けがつきませんが、よく見ると色々違います。
家に帰って、早速食べました。私のカマボコカップヌードル(左)はさぞかし味気ないだろうなと思ったのですが、カップ麺ってスープの味が支配的だから、具の味なんてほとんど関係ないんです。
大下さんのキムチーズカップヌードル(塩スープとキムチ、チーズ、エビ、カマボコ)ですら、若干キムチを感じるくらい。スープあなどりがたし。
大下さんと「今度作るとしたら具は何を入れるか?」という話をしていました。大下さんは、全部ネギにして「カップヌードルSIO」ならぬ「カップヌードルNEGI」を作って、フォントも真似して本格的に作るんだそうです。ぜひ作って欲しい。そして写真に残したい。
大下さんに、ホワイトデーのお返しに何が良いか聞いたら「イチゴが食べたい。」と言われたので、帰り道にあまおうを買って一緒に食べました。これは、う、うまいぞー!
あまおうって、「あ」かくて「ま」るくて「お」おきくて「う」まい、の略らしいですね。すごい略し方だな…。
最近、Sena氏とともに進めてきたガンダム無双2ですが、ついにダウンロードコンテンツも含め全てクリアしました。いやあ、長かったね…。
最後のミッション「真のガンダム無双」とダウンロードコンテンツの「真のガンダム無双2(地上編)」「真のガンダム無双2(宇宙編)」が異常に難しい。敵がありえないくらい強くて、こちらがレベル最大&機体の性能最大でも瞬殺されます。
闘争本能(※1)やDG細胞(※2)のような防御力が下がるスキルを選んでいると、敵エース機に数発殴られただけでお亡くなりになる。これはやってられんね。
まともにやっても埒が開かないので、2人協力プレイの利点を最大限に生かした作戦を取りました。
Sena氏がエースパイロット(※3)をつけて、ウイングガンダムを使います。私は死なないように防御重視でスカイアイ(※4)やガッツ(※5)をつけて、隙の少ないZガンダムあたりを使います。
ウイングは序盤、ひたすらSP攻撃で雑魚を抹殺しまくります。撃墜数が1,000機ぐらいになると敵の攻撃をほぼ受け付けなくなるので、おもむろに敵のエースをボコります。
Zは序盤、隙のでかいウイングがボコられてるときに敵を止めます。中盤以降、ウイングの撃墜数が伸びて強くなったら、敵機をウイングの近くにおびきよせます。その時に敵エース機を殴って気を引いてやると良いです。敵機がウイングを無視してZに殴りかかってきますので、その隙をついてウイングが殴れば確実にヒットします。
ちなみに敵エース機に対してSP攻撃はあまり効きません。普通に殴ってチャージ攻撃を確実に当てる方が強いようです。
(※1)闘争本能: 敵の攻撃を受けてものけぞらない代わりに、防御力が下がる。
(※2)DG細胞: 体力が自然回復するが、防御力が下がる。
(※3)エースパイロット: 100機撃破ごとに、攻撃力と防御力が10% ずつ上昇する。
(※4)スカイアイ: 防御できない方向からの攻撃も防御可能になる。
(※5)ガッツ: パワーダウン状態(しばらく動けなくなる状態)にならなくなる。
先週に引き続き、本町の問屋街へ買い物に行きました。私以外の人たちは今週末のスキーの準備で、私は特に用事はないですがついていきました。
暇だったので靴を見ていたら良さそうな物があったので購入しました。大学時代に良く履いていたMERELLの靴です。
問屋街を歩いているときに、まだ日本橋に行ったことがないと話したらすごく意外そうな顔をされました。なぜだ。せっかくだから行ってみようってことで、本町から歩いて難波、日本橋へ。
日本橋は関西の電気街、簡単に言うと秋葉原のような街です。秋葉原と同じ道を辿っているようで、フィギュアとかアニメ関連の店が多いです。そのうちメイドカフェだらけになるでしょう。
秋葉原と比べると車の通る広い道路が多くて、店どうしがバラバラに離れている感じです。良く言えばゴミゴミしていないってことになりますが、秋葉原の変なジャンク屋とかがある路地裏(?)が育つ余地はなさそうです。
今回は店には寄らず、ひたすら歩いて抜けただけなので、どんな店があったのかはわかりません。
結局、本町から新今宮まで、つまり大阪環状線の半径くらいの距離を歩いた…。道理で疲れるはずだ…。
スキー組が買い残したものを探しに、FTOでデポへ。スポーツ用品店は普段使わない物がたくさんあるからだろうか。見ているだけでけっこう楽しい。
< | 2009 | > | ||||
<< | < | 03 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 | - | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.20.
using GD bundled (2.1.0 compatible)(png support.)