我得到了一個16位的int Date。前七位(從左到右)用於描述年,下4個用於本月,其餘5個用於本日。我需要將原來的16位(年份爲1111111000000000;月份爲0000000111100000;日期爲0000000000011111)分別對應7位,4位和5位。將1字節日期解碼爲年,月和日
回答
更新的解決方案:
我仍然不知道這是否是什麼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})
本質上是這樣做的;
- 從第一個字符
^
(?=[0-1]{16)
檢查,看看是否有串- 從第一個字符在16級零和一個人物拍攝前7
0
和1
,([0-1]{7})
爲一年。 - 做月份和日子相同分別通過
([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
@ GMP_47希望這個作品能讓您高興的進一步討論 –
我無法將其定義爲一種方法。我從「int date = buffer.getInt();」獲取int我只需要知道如何將Date乘以1111111000000000,然後在Java中右移9。 –
道歉,如果我沒有正確理解你的問題,但沒有具體的代碼,我只能從文本中找出你想要的。好。那麼'date'是什麼?價值是怎樣的?你想轉換二進制文件,因爲你只需要這裏的前7位數字?另外,爲什麼你不能將Int轉換爲String並插入我的示例代碼並相應地調整輸出? –
- 1. 解析日期「2016年1月1日星期五」
- 2. 日期將2013年4月1日而不是2013年3月31日
- 3. 將日期從1901年1月01日轉換爲unix/linux
- 4. 將日期時間拆分爲日期/年/月/日名稱和計數年份
- 5. 如何將日/月/年日期轉換爲自0001年1月1日以來.NET樣式100ns的勾號?
- 6. 爲什麼從1970年1月1日起計算日期?
- 7. 如何將日期轉換爲年,月,日日期格式
- 8. T-SQL轉換2010年1月28日至2010年1月28日星期五
- 9. 將1900年1月1日以來的天數轉換爲今天的日期
- 10. 將年,月和日期從日期時間字段中除去爲int
- 11. 將日期時間轉換爲月,日和年?
- 12. 從年,月和日創建日期
- 13. PHP:和的strtotime以後的日期2038年1月19日
- 14. 在Rails中,我如何顯示日期,如2009年12月1日星期一,2009年12月1日
- 15. 1970年1月1日之前的日期
- 16. Oracle日期 - 獲得給定年份的1月1日
- 17. SQL申報日期時間 - 1001年1月1日
- 18. iPhone NSDateComponent錯日期2011年1月1日?
- 19. 如何轉換毫秒自1970年1月1日00:00:00至日期2016年1月20日
- 20. 將「2008年1月」轉換爲日期變量
- 21. 如何在Excel表格中將日/月/年的日期轉換爲月/日/年的日期
- 22. 日期格式爲UTC月份日期和年份(MMM DD,YYYY)
- 23. 如何將整數日期轉換爲格式化日期字符串(即2012009至2009年2月1日)
- 24. 有沒有辦法強制GWT使用格式「1/1/9」作爲「2009年1月1日」而不是「1月1日,9日」來解析日期?
- 25. 如何CONVER日期像2011年3月1日至只有2011年3月
- 26. HQL將年/月/日變更爲年 - 月 - 日
- 27. 從日期到日期(僅年/月)
- 28. 日期格式日期月 - 年
- 29. 將以秒爲單位的日期轉換爲「日月年」日期
- 30. 日期減1年?
到目前爲止你做了什麼?告訴我們你的代碼。你會發現[this](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)有用。 –
Google ['java位操作'](https://www.google.com/search?q=java+bit+manipulation)。 – Andreas
那麼問題是什麼?你有什麼麻煩? –