• ベストアンサー

上位ビットと下位ビットの入れかえ

Wernerの回答

  • Werner
  • ベストアンサー率53% (395/735)
回答No.5

演算回数少なくしたいならよく見るのはこういうやつ。 // 参考ページ(というかそのまんま使ったので引用元か) // http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel 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のリンク先にも同様の考え方を使っているコードがいくつかありますね。

akayoroshi
質問者

お礼

ありがとうございます。データ数100,000,000位までの処理を予定していました。それほど性能の高くない私のPCでも、1秒かからずに処理できそうです。

akayoroshi
質問者

補足

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秒でした。みっともないプログラムを掲載してしまいました。

関連するQ&A

  • ビット演算で00000001と1の頭に0を付ける?

    https://www.grapecity.com/japan/powernews/column/clang/019/page02.htm ビット演算子 表1にCのビット演算子を掲げておきます。ビット演算とは言っても、扱う値はバイト単位などCの一般的な整数のデータ型です。ビット演算子は、それらの値をビット単位で計算します。 ビットシフト演算(<< >>)~2倍と1/2 例えばunsigned char型の1は、2進数では"00000001"という形のビット列(ビットパターン)になります。これを1桁左にずらす(シフトする)と"00000010"となります。ずらしてあふれた左端の0は消え、空いた右端には0が入ります。 "00000001"は10進数の「1」、"00000010"は10進数の「2」です。つまり、ビット列を左に1桁シフトすると値は2倍になるのです。 -----------------------------------------  以上ですが、C言語の、ビット演算の解説の抜粋です。ビット演算はまだ覚えたてですが、"00000001"整数1の頭にわざわざ、0を沢山 つける目的は何なのでしょうか!?  よろしくお願いします。

  • 小数点を整数型に変換

    ・8.7  ・14.5 ・3.456 などのデータがあり、この値を四捨五入 などをせずに 「整数2桁 + 小数5桁」に変換したいのですが、String.Formatなどで行うと意図した値になりません。 ・8.7 ⇒ 87.00000 ・14.5 ⇒ 14.50000 ・3.456 ⇒ 34.56000 何か良い方法がありましたら、アドバイスを頂けないでしょうか。 言語:C# VisualStudio 2008 以上、よろしくお願い致します。

  • EXCELでの16進数取り出し、上位桁と下位桁取り

    恐れ入ります。詳しい方教えてください。 各セルに2000までの数値があるデータがあり、このデータを16進数表記で、上位2桁と下位2桁に分けたいと考えています。 例) 870  → &h03, &h66 (870は10進数で366が16進数、これを&hを付けて03と66に分けたい) 1926 → &h07, &h86  ="0x"&DEC2HEX(C4, 4)を使って16進数4桁にすることまでは調べたのですが、上位2桁、下位2桁に分けられず悩んでいます。

  • 或る列に整数部3桁少数桁2桁の数値が並んでおります。これを少数点第一位

    或る列に整数部3桁少数桁2桁の数値が並んでおります。これを少数点第一位で四捨五入した値(整数)にしたいのですがどのような方法がありますでしょうか? お解りの方がおられたら教えてください。 宜しくお願いします。

  • 1バイト文字の上位4ビット・下位4ビットの入れ替え方法を教えて下さい

    あるパスワードをテキストファイルに書き込む処理です。 そのままだと、パスワードの意味が無いので、上位4ビットと下位4ビットを入れ替えて保存しようと思います。 上位・下位それぞれ4ビットシフトするところまでは出来ました。  Dim a As Integer  Dim a1 As Integer  Dim a2 As Integer  a = Asc("a")  a1 = a \ 2 ^ 4  a2 = a * 2 ^ 4  MsgBox (Hex(a1))  MsgBox (Hex(a2)) が、それを8ビットに戻す方法が分かりません。 また、パスワードは1バイト文字による文字列ですが、文字列長分を1バイトずつバッファに読み込んで、変換し、同サイズのバッファに詰め込んでいく処理も分かりません。 以前、MS-C(MSDOS上のC言語)を少しやったので、それでなら分かるのですが、VBは全くの初心者で、調べても調べても見当がつきません。 どうか教えて下さい。 宜しくお願い致します。

  • 乱数の生成について

    Javaの本を購入し、演習を行いましたが思った以上に理解できませんでした。 例題と演習を記入いたしますので、どなたかご教示くだされば幸いです。 ちなみにですが、本は初心者向けで例題のみで解けるものと思われます。 【例題1】0~9の数値を乱数で生成して表示 import java.util.Random; public class Lesson2to14 { public static void main(String[] args) { Random rand = new Random(); int lucky = rand.nextInt(10); System.out.println("今日のラッキーナンバーは" + lucky + "です。"); } } 【演習1】一桁の正の整数値、一桁の負の整数値、二桁の正の整数値をランダムで生成せよ import java.util.Random; public class Exercise2to7 { public static void main(String[] args) { Random rend = new Random(); int lucky = rend.nextInt(10); System.out.println("一桁の正の整数値を表示します:" + (lucky + 1)); Random rend2 = new Random(); int lucky2 = rend2.nextInt(9); System.out.println("一桁の負の整数値を表示します:" + -lucky2); Random rend3 = new Random(); int lucky3 = rend3.nextInt(90); System.out.println("二桁の正の整数値をランダムに生成します:" + (lucky3 + 10)); } } 演習1に関しては例題からなんとなく理解をしてプログラムを組むことができました。(当たってるかは不明です...) しかし演習2と3については例題1では組めるのか理解できません。 【演習2】キーボードから読み込んだ読み込んだ整数値±5の範囲の整数値をランダムに生成して表示するプログラムを作成せよ。 0~5であればrend.nextInt(6)で簡単にランダム生成できますが、 -5~5の範囲となると例題だけでは何も思いつきませんでした。 【演習3】 -1.0以上1.0未満の実数値をランダムに生成して表示せよ。 上記の場合はnextFloatから生成された数値から-1引けばできると思います。 しかし、例えば-2.0以上10以下など正負の値をランダムで生成する方法が解っていません。 こちらも良かったらご教示お願い致します。

    • ベストアンサー
    • Java
  • ビット幅について質問

    byte型(-128~127)のビット幅は8ですが、これは、たとえば整数の5を表すときに、2進数8桁必要ってことですよね? ちなみに、整数5を2進数で表すとどうなりますか?

    • ベストアンサー
    • Java
  • 場合の数

    整数αは、1から9999の値で、そのなかの1桁、2桁、3桁の数は000、00、0をつけて4桁とみなす。このαの一の位と千の位、百の位と十の位を入れ替えた数をα’とすると、整数(α-α’)がとり得る値は何通り? 答えは361通りですけど、求め方が分かりません。 教えて下さりませんか?お願いします。

  • ビット単位のソート

    あるtextフィールドに '10010000' のように1と0で構成されたものがあります。 このフィールドにたいして、ソート(order by)を行いたいのですが、 何桁目が1のものを上位に、のようなソートを行いたいと思っています。 任意の桁の値だけ取り出せないかと、 型変換、フォーマットや算術演算を使ってみましたがうまくできませんでした。 たとえば '10010000' から5桁目の値 '1' のみを取り出す方法です。 ソートで使用するのが目的です。 わかります方いらっしゃいましたら、よろしくお願いいたします。

  • 計算の仕方

    4桁以上の正の整数があるとき、その整数の、 1の位の値 10の位の値 100の位の値 をそれぞれ計算して出したいのですが、どのようにすればいいのでしょうか?