1

10 ビットのバイナリ文字列があり、反復ごとに循環的にビット単位でシフトする必要があります。私はとても混乱していて、それをするのに迷っています。簡単に行うための背後にあるロジックは何ですか? 16 進数の場合、num>>1 または num<<1 で実行できますが、「1010101010」のような文字列は、ビットごとのシフトを適用する前に 16 進数に変換する必要があります。ビット単位のシフトを循環的に 10 回適用する必要があります。

4

4 に答える 4

3

Integer クラスには、バイナリ文字列との間で変換するメソッドがあります。

    int i = Integer.parseInt("1010101010", 2);
    String shiftedi = Integer.toBinaryString(i<<1);

編集、上記は循環ではありませんが、単純な文字列操作を使用できます。

String in = "1010101010";
String shifted1 = in.substring(1)+in.substring(0,1);
于 2012-04-24T22:23:59.270 に答える
1

一般的に言えば、数値演算を行う場合は、数値に対して行うのが最善です。したがって、文字列を実際に表す int (またはその他のもの) に変換することをお勧めします。次に、必要に応じてビットシフトを実行してから、文字列に戻すことができます。

テキスト操作だけを行いたい場合は、StringBuffer を使用して文字をいじることができます。

StringBuffer s = new StringBuffer("1010101010");
for(int i=0; i<10; i++) {
    char c = s.charAt(0);
    s.append(c);
    s.deleteCharAt(0);
}
String result = s.toString();

しかし、あなたが数学をやろうとしているだけなら、それはただ醜いです

于 2012-04-24T22:06:32.743 に答える
1

String0 と 1 を含むa (別名「バイナリ文字列」) を扱っていると仮定すると、ビットごとのシフトは簡単です。

「左シフト」するには、「左シフト」ごとに右端に「0」文字を追加します。

「右にシフト」するには、もう少し複雑です。バイナリで常に「正の数」を扱っていると仮定すると、「右シフト」ごとに右端の文字を削除します。「符号拡張右シフト」を実行する場合は、文字列の長さをチェックして、2 の補数形式のバイナリ値の特定のエンコーディングの「最大長」であるかどうかを確認する必要があります。次に、文字列を削除する必要があります。左端の文字がすでに「1」である場合は、オプションで左端に「1」の文字を追加します。

現在、文字列の長さは制限されていないため (WORD と DWORD>>>)、演算子がバイナリ文字列に対して意味があるかどうか、または負の数の 2 の補数表現がバイナリ文字列に対して意味があるかどうかは明確ではありません。文字列内の有効な文字数の「制限」。2 つのバイナリ文字列間で何らかの種類のバイナリ演算を実行する場合、その制限は 2 つのバイナリ文字列に対して同じである必要があります (または小さい方の文字列のプロモーション ルールが必要です)。

もう 1 つのオプションは、文字列を整数に変換し、整数に対して 2 項演算を使用することです。

于 2012-04-24T22:37:35.767 に答える
0
int bits = Integer.parseInt ("010101010", 2);

String を int に変換します。「ビット単位のシフトを適用する前に 16 進数に変換する」というのはナンセンスです。申し訳ありません。16 進数は、int を表す方法にすぎません (たとえば)。表現ではなく、int値をシフトします。

于 2012-04-24T22:26:49.867 に答える