2017-07-25 19 views
-2

整数n、値v(v = 0または1)と位置pが与えられます。 nのバイナリ表現から位置pに値vを保持するためにnを変更する一連の演算子を記述します。例:Java単純なビット操作

  • N = 5(00000101)、p = 3、V = 1 - > 13(00001101)
  • N = 5(00000101)、P = 2、V = 0 - > 1(00000001 )

これは私のコードです:

int n1 = 35; 
int p1 = 3; 
int v = 1; 
n1 = n1 + (v << p1); 
System.out.println(n1); 

それはときV = 1が、V = 0は、そうでないときに動作します。

+0

合計を使用すると、v = 0の場合は、0が加算されます(シフトしても0であることは変わりません)ので、値は変更されません。あなたはそこで別の操作を探したいかもしれません。おそらくビット操作。 – bracco23

+0

私は解決策に答えるつもりはありません。これは間違いなく割り当てのように見えますから、あなたはそれを自分で達成できるはずです。 – bracco23

+0

@ bracco23それは割り当てのように見えますが、そのようなことについて私は通常、コードなしでアプローチを提供します。あなたが気にしないことを願っています。乾杯。 –

答えて

0

あなたが値にインデックスを「設定」にしたいので、あなたはあなたがする必要があるすべては右のインデックスで右の番号を入れている二つの操作今

'and' will set 0 values at an index to 0, but won't work for 1 values 
'or' will set 1 values at an index to 1, but won't work for 0 values 

のいずれかが必要。これは、その場所にゼロを得るために、私たちは業務の一部についてゼロを必要とし、覚えて、あなたはビットを反転する必要が

'1 << 3' shifts the 1 three places, resulting in '00001000' 

例えば1

'<<' moves the 1 a number of places 

をシフトすることによって行うことができます

'not' or '~' flips all the bits in a number 

~00001000 yeilds 11110111 

今、私たちは、私たちが望むインデックス内の1または0を持つことができ、かつ唯一の所望の動作に基づいて正しいものを選ぶと、対応するandまたはを適用するためにif文を使用する必要がありますの操作で希望のビットを設定します。

0

これはうまくいくと思いますが、結果をコンソールに正しく印刷するにはどうすればいいですか?

// Swapping i and j: i ^= j, j ^= i, i ^= j; 
    // Getting the pth byte: (n >> p) & 1 
    // Setting the pth byte to v: (v == 0) ? (n & ~(1 << p)) : (n | 1 << p) 
    static int Exchange(int n, int i, int j) 
    { 
     n = ((n >> i) & 1^(n >> j) & 1) == 0 ? (n & ~(1 << j)) : (n | 1 << j); 
     n = ((n >> i) & 1^(n >> j) & 1) == 0 ? (n & ~(1 << i)) : (n | 1 << i); 
     n = ((n >> i) & 1^(n >> j) & 1) == 0 ? (n & ~(1 << j)) : (n | 1 << j); 

     return n; 
    } 

    public static void main(String[] arguments) 
     { 
      int n = 56, p = 3, q = 24, k = 3; 

      while (k-- != 0) n = Exchange(n, p++, q++); 
     }