2016-08-14 8 views
-5

私は16ビットでint日付を取得しました。最初の7ビット(左から右へ)は年を記述するために使用され、次の4ビットは月のために使用され、残りの5ビットは日のために使用されます。それぞれの7,4,5ビットを元の16ビットから分離する必要があります(年は1111111000000000、月は0000000111100000、日は0000000000011111)。1バイト日付を年、月、日にデコードする

+3

あなたはこれまで何をしましたか?あなたのコードを私たちに教えてください。そして、あなたは[this](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)が役に立ちます。 –

+0

Google ['java bit manipulation'](https://www.google.com/search?q=java+bit+manipulation)。 – Andreas

+0

だから何が問題なのですか?何が問題になっていますか? –

答えて

0

更新ソリューション:

私はまだ、これは具体的なコードは彼の質問に記載しなかったとして、OPが探しているものであるかどうかわかりません。

同様に、期待される出力が何であるかはわかりませんでした。私たちが知っているのは、OPに16ビットのバイナリが与えられていて、特定の方法でYear、Month、Dayのバイナリコードを調べる必要があるビット位置。

バイナリがキャプチャされたら、バイナリビットを数値に変換し、それをさらに比較するために使用します。

private long unsetBit(long value, int pos) { return value & ~(1<<pos); } 

private long getYear(long value) { return value >> /*total 0 in month and day=*/9; } 

private long getMonthDay(long value) { 
    int[] leftBitPos = new int[]{ 16, 15, 14, 13, 12, 11, 10 }; 
    for (Integer position : leftBitPos) value = unsetBit(value, position); 
    return value; 
} 

private long getMonth(long value) { 
    value = getMonthDay(value); 
    return value >> /*total 0 in day=*/5; 
} 

private long getDay(long value) { 
    int[] leftBitPos = new int[]{ 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5 }; 
    for (Integer position : leftBitPos) value = unsetBit(value, position); 
    return value; 
} 

private void doIt() { 
    long fullDate = 0b1111111110100001; 
    System.out.println("Year binary: " + getYear(fullDate)); 
    System.out.println("Month binary: " + getMonth(fullDate)); 
    System.out.println("Day binary: " + getDay(fullDate)); 

年バイナリ:127
月バイナリ:29
日バイナリ:1

例えば、> 100の年の値は、それが年> 2000年

私の解決策であることを意味します

古い解決法、regexpr方法。

OPはバイナリ値をStringに変換し、 "Year"、 "Month"、 "Day"のバイナリコードに興味があると仮定していると仮定します。

単純なcapture正規表現を実行して、特定の日付の0と1を検索し、取り込まれた値をさらに0にパディングして処理することを提案します。あるいは、regexprを使いたくない場合は、string.substringを実行して同じことを行い、ゼロで埋めてください。

regexprを使用することをお勧めします。 ^(?=[0-1]{16})([0-1]{7})([0-1]{4})([0-1]{5})

これは基本的には何ですか。

  1. 最初の文字^
  2. (?=[0-1]{16)チェックから、最初の文字から文字列
  3. で16の0と1の文字が年の最初の7 01([0-1]{7})をキャプチャしているかどうかを確認します。
  4. 今ゼロの適切な量を使用して年、月と日の結果値をプレフィックスとパッド([0-1]{4})([0-1]{5})

を通じて、それぞれの月と日のために同じことをします。

例:

final String YEAR_PADDING = "0000000"; 
final String MONTH_PADDING = "0000"; 
final String DAY_PADDING = "00000"; 

private void doIt() { 

    Pattern binaryDateFormat = Pattern.compile("^(?=[0-1]{16})([0-1]{7})([0-1]{4})([0-1]{5})"); 
    Matcher m = binaryDateFormat.matcher("1111111111100000"); 

    while (m.find()) { 
     System.out.println("Year binary: " + m.group(1) + MONTH_PADDING + DAY_PADDING); 
     System.out.println("Month binary: " + YEAR_PADDING + m.group(2) + DAY_PADDING); 
     System.out.println("Day binary: " + YEAR_PADDING + MONTH_PADDING + m.group(3)); 
    } 

} 

出力:

年バイナリ:1111111000000000
月バイナリ:0000000111100000
日バイナリ:0000000000000000

+0

@ GMP_47これはあなたのためにもっとうまく議論することを願っています –

+0

私はそれを方法として定義することはできません。私は "int date = buffer.getInt();"からintを取得します。私はちょうど1111111000000000で日付を掛ける方法を知って、そしてJavaで右9をシフトする必要があります。 –

+0

私はあなたの質問を正しく理解していなかったが、具体的なコードがなければ、私はあなたがテキストから欲しいものを作ることしかできなかったことを謝罪します。 OK。だから、 '日付'は何ですか?価値観はどのように見えますか?バイナリをシフトしたかったのは、ここで最初の7桁だけを欲しかったからです。また、Intを文字列に変換して、私のサンプルコードにプラグインし、それに応じて出力を微調整できないのはなぜですか? –

関連する問題