2016-08-14 189 views
-5

我得到了一個16位的int Date。前七位(從左到右)用於描述年,下4個用於本月,其餘5個用於本日。我需要將原來的16位(年份爲1111111000000000;月份爲0000000111100000;日期爲0000000000011111)分別對應7位,4位和5位。將1字節日期解碼爲年,月和日

+3

到目前爲止你做了什麼?告訴我們你的代碼。你會發現[this](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)有用。 –

+0

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

+0

那麼問題是什麼?你有什麼麻煩? –

回答

0

更新的解決方案:

我仍然不知道這是否是什麼OP是尋找,因爲沒有具體的代碼是在他的問題說明。

類似地,他沒有說明預期的輸出是什麼,我們現在所知道的是一個16位二進制被賦予OP,並且他將需要通過某些確定年,月和日的二進制代碼位位置。

一旦二進制文件被捕獲,然後將二進制位轉換爲數值,然後將其用於進一步比較。例如,> 100年的價值意味着它是一年> 2000

我的解決辦法:

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

舊的解決方案,正則表達式的方式。

假設OP有把奢侈的價值轉換成一段String,然後假設他只是對「Year」,「Month」和「Day」的二進制代碼感興趣。

我會建議做一個簡單的capture正則表達式來查找特定日期的0和1,然後通過填充一些零進一步處理捕獲的值。或者,如果你不喜歡使用regexpr,你可以看看做一個string.substring,並做同樣的事情,用零填充它。

推薦使用regexpr; ^(?=[0-1]{16})([0-1]{7})([0-1]{4})([0-1]{5})

本質上是這樣做的;

  1. 從第一個字符^
  2. (?=[0-1]{16)檢查,看看是否有串
  3. 從第一個字符在16級零和一個人物拍攝前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)); 
    } 

} 

輸出:

年份二進制:11111110億
月二進制:0000000111100000
日二進制:0000000000000000

+0

@ GMP_47希望這個作品能讓您高興的進一步討論 –

+0

我無法將其定義爲一種方法。我從「int date = buffer.getInt();」獲取int我只需要知道如何將Date乘以1111111000000000,然後在Java中右移9。 –

+0

道歉,如果我沒有正確理解你的問題,但沒有具體的代碼,我只能從文本中找出你想要的。好。那麼'date'是什麼?價值是怎樣的?你想轉換二進制文件,因爲你只需要這裏的前7位數字?另外,爲什麼你不能將Int轉換爲String並插入我的示例代碼並相應地調整輸出? –

相關問題