将1字节日期解码为年,月和日

时间:2016-08-14 23:18:54

标签: java

我得到一个16位的int日期。前七位(从左到右)用于描述年份,接下来的4位用于月份,其余5位用于该日期。我需要将原始的16位(年份为1111111000000000;月份为0000000111100000;日期为0000000000011111)分别分别为7位,4位和5位。

1 个答案:

答案 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})

基本上这是做什么的;

  1. 来自第一个字符^
  2. (?=[0-1]{16)检查并查看字符串
  3. 中是否有16个零和一个字符
  4. 从第一个字符开始捕获今年的前7个01([0-1]{7})
  5. 分别通过([0-1]{4})([0-1]{5})
  6. 执行相同的月份和日期

    现在使用适当的零值为您的年月日结果值添加前缀和填充。

    示例:

    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