Java 如何反转此位操作?
这可能很容易,但我被卡住了 我正在使用一个16位大小的长变量,它保存当前小时和分钟的值Java 如何反转此位操作?,java,bit-manipulation,Java,Bit Manipulation,这可能很容易,但我被卡住了 我正在使用一个16位大小的长变量,它保存当前小时和分钟的值 0000 1000 0011 1111 请注意: 前4位是无用的 最后6位是小时,剩余的代表分钟 无法更改此变量类型或大小 这就是我成功获取小时和分钟的方法: hour = ((int) original_value >> 6) & 0x1F; minute = ( (int) original_value ) & 0x3F; 如何反转此操作以创建具有不同小时和分钟的新原始\u
0000 1000 0011 1111
请注意:
前4位是无用的
最后6位是小时,剩余的代表分钟
无法更改此变量类型或大小
这就是我成功获取小时和分钟的方法:
hour = ((int) original_value >> 6) & 0x1F;
minute = ( (int) original_value ) & 0x3F;
如何反转此操作以创建具有不同小时和分钟的新
原始\u值?我可能遗漏了一些内容,但这应该可以做到:
new_value = (new_hour << 6) | (new_minutes & 0x3f);
我可能遗漏了什么,但这应该可以解决问题:
new_value = (new_hour << 6) | (new_minutes & 0x3f);
如果最后6位是小时,为什么要右移6位来获得小时?为什么要按位和使用0x1F
?在这两种情况下都应该是0x3F
,因为每一个都有6位长?我想你的意思是“从左边读……前4位是无用的,“‘下一个’6位是小时,最后6位是分钟”。是@DanAllen。抱歉,这有点让人困惑。@Codebender我之所以使用0x1F
是因为我想消除在小时和分钟之前可能出现的任何无用信息。如果最后6位是小时,为什么要将6位右移以获得小时?为什么要使用0x1F
?在这两种情况下都应该是0x3F
,因为每一个都有6位长?我想你的意思是“从左边读……前4位是无用的,“‘下一个’6位是小时,最后6位是分钟”。是@DanAllen。抱歉,这有点让人困惑。@Codebender我之所以使用0x1F
进行点评,是因为我想消除任何可能在小时和分钟之前出现的无用信息。我会添加一个验证0@DanAllen这是一个很好的建议。添加。@SeanBright Why和ing with0x3f
验证0@TDG它不会验证小时数是否在0到59之间,它只会停止超过6位的或数据进入结果。在我看来,验证new_hour
和new_minute
的值超出了问题的范围(而且实现起来很琐碎)。我将添加一个验证0@DanAllen,这是一个很好的建议。添加。@SeanBright Why和ing with0x3f
验证0@TDG它不会验证小时数是否在0到59之间,它只会停止超过6位的或数据进入结果。IMO,验证new_hour
和new_minute
的值不在问题的范围内(而且实现起来很简单)。