我得到一个16位的int日期。前七位(从左到右)用于描述年份,接下来的4位用于月份,其余5位用于该日期。我需要将原始的16位(年份为1111111000000000;月份为0000000111100000;日期为0000000000011111)分别分别为7位,4位和5位。
答案 0 :(得分:0)
更新解决方案:
我仍然不确定这是否是OP所看到的,因为在他的问题中没有说明具体的代码。
同样地,他没有说明预期的输出是什么,我们现在知道的是给了OP一个16位的二进制数,他需要通过某些位找出年,月和日的二进制代码位置。
捕获二进制文件后,将二进制位转换为数值,然后将其用于进一步比较。例如,年份值> 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
旧解决方案,regexpr方式。
假设OP可以将二进制值转换为一个字符串,然后假设他只对“年”,“月”和“日”的二进制代码感兴趣。
我建议做一个简单的capture
正则表达式来查找特定日期的0和1,然后通过向它填充一些零来进一步处理捕获的值。或者,如果你不喜欢使用regexpr,你可以看看做一个string.substring并做同样的事情,用零填充它。
推荐使用regexpr;
^(?=[0-1]{16})([0-1]{7})([0-1]{4})([0-1]{5})
基本上这是做什么的;
^
(?=[0-1]{16)
检查并查看字符串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));
}
}
<强>输出:强>
二年级:1111111000000000
月二进制:0000000111100000
日二进制:0000000000000000