2016-08-02 8 views
1

したがって、整数nと2つのlong xyを取るメソッドがあります。最初のnバイトをxから、残りをyから戻す必要があります。十分に簡単ですが、私はバイトで直接作業するのが初めてで、このメソッドを動作させることはできません。Javaはlongから特定のバイトを取得します

public static long nBytesFromXRestY(int n, long x, long y) { 
    int yl = longToBytes(y).length; 
    byte[] xx = new byte[yl]; 
    byte[] xa = longToBytes(x); 
    byte[] yb = longToBytes(y); 
    for (int i=0;i<xx.length;i++) { 
     if (i < n) { 
      System.out.println("i < n"); 
      xx[i] = xa[i]; 
     } else { 
      xx[i] = yb[i]; 
     } 
    } 
    System.out.println(Arrays.toString(xx)); 
    return bytesToLong(xx); 
} 

私はn = 3x = 45602345、およびy = 10299207のためにその方法を供給した場合、それは(右..?)45699207を返す必要がありますが、それは10299207 ...

を返します。私が知っているように、それは"i < n" 3回を印刷しますforとif/elseが動作しています。何らかの理由でまだyb配列しか返していません。これは愚かな質問である場合は申し訳ありません..私のための新しいコンセプト。

EDIT:longToBytesbytesToLong方法:

public static long bytesToLong(byte[] bytes) { 
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); 
    buffer.put(bytes, 0, bytes.length); 
    buffer.flip();//need flip 
    return buffer.getLong(); 
} 

public static byte[] longToBytes(long x) { 
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); 
    buffer.putLong(0, x); 
    return buffer.array(); 
} 
+0

あなたは数字と混同しているようです。あなたが望む出力では、 'x'の最初の3桁と' y'の残りの部分を取ります。 – Tunaki

+0

さて、私はそれが何であるかの感覚を持っていました。だから私はそれに同じ数字をフィードし、最初の3バイトではなく、数字を使用する場合、このメソッドが返すべきものは何でしょうか? – isaac6

+0

結果はあなたのものとまったく同じです。 'longToBytes(45602345) 'と' longToBytes(10299207) 'を印刷すると、最初の3つがすべて0であることがわかります。 – Tunaki

答えて

1

あなたがオブジェクトを作成するのではなく、bitshifting使用することができます。

public static long nBytesFromXRestY(int n, long x, long y) { 
    long mask = ~0L << (n * 8); 
    return (x & mask) | (y & ~mask); 
} 

これは、yの最下位のn * 8ビットとxの上位ビットを返します。予想通り

http://ideone.com/1CkqYT

プリント。

45299207   
+1

それは素晴らしいです、ありがとう。それをはるかに良い方法のように思えます。ビット演算子の読書をする時間。 – isaac6

関連する問題