質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

3889閲覧

Java ビット計算

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/02/06 01:56

Javaでビット演算と格納するために、BigIntegerを使ってみたら・・・
64bitまでしか返ってこず、それ以上のビット単位を入出力をしたいのに、できない・・・
もし扱える関数または方法教えてください。お願いします。

【目標】格納できる最大ビットは8192bitまで

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

BitSet (java.util.BitSet)を使うのはいかがでしょうか。

下記のサンプルは、シフト演算の例です。

lang

1// import java.util.BitSet; 2 3BitSet bits = new BitSet(); 4bits.set(3000); 5bits.set(8190); 6System.out.println(bits); // => {3000, 8190} 7BitSet shifted = bits.get(1, bits.length()); 8System.out.println(shifted); // => {2999, 8189} 9System.out.println(shifted.toByteArray().length); // => 1024

参考URL:
java.util.BitSet - Java SE 8 APIドキュメント
Shifting a Java BitSet - Stack Overflow


(追記)

BitSetBigIntegerに変換するには、例えばこのようにすると良いです。
ちゃんとテストしていないので、実際に使うときにはご注意ください。

バイト配列の先頭は、常に符号を正にするために余分に1バイト空けています。

lang

1static BigInteger toBigInteger(BitSet bits) { 2 byte[] bytes = new byte[bits.size() + 1]; 3 int i = bytes.length; 4 for (byte b : bits.toByteArray()) { 5 --i; 6 bytes[i] = (byte)(b & 0xFF); 7 } 8 return new BigInteger(bytes); 9}

投稿2015/02/06 02:29

編集2015/02/08 12:05
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/02/07 06:01

2進数を文字列として出力できましたが、10進数への文字列出力をどうすればいいでしょうか?32ビット内ならIntとかできますが、それ以上超える場合の10進数への出力をしたいんですがどうすればいいでしょうか?教えてください。 //ビットを2進数文字列出力 for(int i=bits.length()-1;i>=0;i--){ System.out.print((bits.get(i)? "1" : "0")); if(i%4==0)System.out.print(" "); } 出力例: 1110 0000 1010 0011
退会済みユーザー

退会済みユーザー

2015/02/07 06:06

↑例え追記 //ビットを2進数文字列出力 String str=""; for(int i=bits.length()-1;i>=0;i--){ str+=bits.get(i)? "1" : "0"; if(i%4==0)str+=" "; } System.out.println(str); 出力例: 1110 0000 1010 0011
argius

2015/02/07 14:16

既にBAをいただいてしまいましたが、10進数の例を追記しました。
退会済みユーザー

退会済みユーザー

2015/02/07 15:04

BitSetからByteへ、ByteからBigIntegerの処理方法教えていただきありがとうございます。ですが、これだと結局64bitしか扱えない10進数(9223372036854775808~9223372036854775807)数字になるのでは?これ以上の扱えるデータ型はやはり存在しないんでしょうか?これ以上の大きなbitを10進数や16進数など変換不可能でしょうか?しつこくて失礼ですが、宜しければお答えお願いします。
argius

2015/02/07 21:48

BigIntegerは64bitよりも大きな数値でも扱えます。 例えば、2^1000は、BigInteger.valueOf(2).pow(1000)で、BitSetならbits.set(1000)と同じになります。 16進数文字列に変換するには、BigInteger#toString(int)を使います。例えば、BigInteger.valueOf(2).pow(1000).toString(16)のようにします。
退会済みユーザー

退会済みユーザー

2015/02/08 11:59

なるほど!ここまで色々教えていただきありがとうございます! 試しでBigIntegerのsetBitでビットを1と0を入れてたので、64以内のfor文でsetBit(乱数で1と0)を入れてたら問題無いが、それを超えるビットにしたら何故かSystem.out.println();で出力できたはずができなくて、64ビットしか扱えないと勝手に思い込んでいました・・・ argiusから色々教えてもらえて理解できました。本当にありがとうございます。
argius

2015/02/08 12:08

どういたしまして。 最終的な解決に到ったみたいですね。良かったです。
退会済みユーザー

退会済みユーザー

2015/02/10 03:22

【後から原因気づいたこと】 64ビット超える値をSystem.out.println();に出力できなかった原因が分かりました。自分が作った素数かどうかの確認用メソッド(入力: BigInteger, 出力: boolean)のせいで、そこで止まったまま次への処理に行かず、System.out.println()の出力できなかったという・・・また新しい質問の素数確認処理について書きますので。もしよろしければ、回答お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問