No.1ベストアンサー
- 回答日時:
自分で書いてはいませんが,
Doukaku.orgのソースコードは参考になりますか?
(Posted feedbacksから言語を選んでください。)
http://ja.doukaku.org/61/
この回答への補足
参考までに、私の作ったプログラムは以下のとおりです。
unsigned int rbp( unsigned int z ) {
// reverse bit pattern of integer
// Programmed by Akayoroshi on 2009-02-04.
unsigned int m1=1<<16, m2=1<<15;
while( m2 ) {
unsigned int mask=m1|m2;
if ( (z&mask)%3 ) z^=mask;
m1<<=1; m2>>=1;
}
return z;
}
もっとうまい方法はないかと思ってお尋ねしました。
ありがとうございました。
まさに同じことをやっているWebページがあったのですね。
全部のプログラムを見てはいませんが、いくつか参考になるものがありました。
ビットごとの処理を繰り返すか、ビットをまとたものを表引きするかのどちらかになるようです。
No.5
- 回答日時:
演算回数少なくしたいならよく見るのはこういうやつ。
// 参考ページ(というかそのまんま使ったので引用元か)
// http://graphics.stanford.edu/~seander/bithacks.h …
unsigned int reverse_bits(unsigned int v){
v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
v = ( v >> 16 ) | ( v << 16);
return v;
}
No.1のリンク先にも同様の考え方を使っているコードがいくつかありますね。
この回答への補足
1から10,000,000までのすべての整数についてビットパターンを逆転させたときの所要時間を計ってみました。(環境は、Athlon64x2, Windows Vista64, Visual Studio 2008, C++ Release構成, 3回計測の平均値です。)
この回答のプログラムでは、0.0807秒(この回答のプログラム中の5つの代入文は順序を入れ替えても正しく処理できるのように見えますので、文の順序を変えたものも計ってみました。この回答通りの順序が最速でした。)
No.4の回答のプログラムでは、1.2135秒(3項演算子を、お礼の中に示したifに変えると1.0774秒)
No.1に示した私のプログラムでは、3.0733秒でした。みっともないプログラムを掲載してしまいました。
ありがとうございます。データ数100,000,000位までの処理を予定していました。それほど性能の高くない私のPCでも、1秒かからずに処理できそうです。
No.4
- 回答日時:
上位下位の入れ替えじゃなくてビットパターンを逆順にするんですよね、これ。
こんな感じでどうでしょう?
unsigned long rbp(unsigned long pattern)
{
int i;
unsigned long ret = 0;
for(i = 0; i < 32; i ++)
{
ret |= (pattern & (1 << i)) ? (1 << (31 - i)) : 0;
}
return ret;
}
……あんまし変わらないか。
ありがとうございます。
ret=0;
for( i=0; i<32; i++ ) {
if ( pattern&(1<<i) ) ret |= 1<<(31-i);
}
と同じですね。たしかに、わかりやすいですね。
No.3
- 回答日時:
そのまま書くと深く考えないと思うのでヒント形式で。
sに元の値、dに逆の値を設定するとして。
(1)sの最上位ビットをdに加える。
(2)sとdをそれぞれビットシフトする。
(3)繰り返す。
と肝心なことをボカして書いてみました。
とりあえず動かないプログラムでも良いので、プログラムが出来たら補足で書き込んでください。
ありがとうございます。
私の作った、正しく動くものをNo.1の回答の捕捉に載せました。
私のプログラムのほうが、ご回答の方法よりも演算回数は少なくて済むと思います。
予断のない形で、うまい方法を教えていただきたかったので質問にはプログラムを示しませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 以下の問題が分かりません。 8ビット浮動小数点数が、最上位ビットから順に符号1ビット、指数部3ビット 4 2023/07/22 16:06
- Oracle ビットで表せる数値について 3 2022/09/12 16:37
- 工学 疑似乱数生成器 3 2023/01/05 02:06
- 情報処理技術者・Microsoft認定資格 情報技術の問題についてです。 10進数の−36を以下のような16ビットの浮動小数点表示にするといくつ 3 2022/05/21 19:53
- ネットワーク 以下の問題を教えてください ホストを50台収容するLAN上のネットワークを構成したい。ネットワークア 2 2022/06/18 20:07
- その他(データベース) Accessフォームにて指定のフィールドの平均値を小数点第一位で表示できない 2 2022/08/30 17:19
- 計算機科学 2進数の計算について 2進数の値は全て8ビットで負数は2の補数形式とする。結果が8ビットで表現出来な 3 2023/07/22 14:08
- スピーカー・コンポ・ステレオ DAC[について・・・ 1 2022/08/29 11:44
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- その他(IT・Webサービス) 2ビット、3ビット、4ビットのグレイコードの作成方法を詳しい方にわかりやすく教えていただきたいです。 1 2023/07/07 16:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAのIf,Then 構...
-
0xffffとは?
-
C言語で128bitの2進数のビット...
-
シーケンス制御についての質問...
-
verilog 符号付加減算(最上位...
-
符号無し整数xを右にnビット回転
-
ビット演算について
-
03分22秒36のような時間の単位...
-
8ビットのデータの、先頭ビット...
-
浮動小数点数の内部表現につい...
-
ビットシフトってどんな時使うの?
-
成人してから
-
アセンブラの参考書(初心者)
-
ライン数とステップ数の違いは?
-
アセンブリ言語について。
-
アセンブラからC言語に変換する...
-
7セグメントLEDの点灯について
-
アセンブラエディタ
-
delph5 ボタンの色を変更するに...
-
昔のゲーム製作に使用する言語...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
C言語で128bitの2進数のビット...
-
命令について
-
符号無し整数xを右にnビット回転
-
文字参照は10進数と16進数では...
-
verilog 符号付加減算(最上位...
-
[VBS] 素早くローテート演算したい
-
算術シフト演算が成り立つ理由...
-
アルゴリズムの計算量とオーダ
-
03分22秒36のような時間の単位...
-
シーケンス制御についての質問...
-
CASLIIでかけ算
-
上位ビットと下位ビットの入れかえ
-
ブール代数で解き方がわかりません
-
ビットの取り出し方法
-
PS3に搭載されている"Cell"は、...
おすすめ情報