java – 在int类型中设置4位半字节
发布时间:2020-12-15 04:13:17 所属栏目:Java 来源:网络整理
导读:我们需要提出一种在int中设置4位半字节的方法 输出应该是这样的: setNibble(0xAAA5,0x1,0); // = 0xAAA1 setNibble(0x56B2,0xF,3); // = 0xF6B2 这就是我写的…… 但是有一些我无法弄清楚的错误 setNibble(FFFF,0): Expected: FFF0 Result: FF00 setNibble(
我们需要提出一种在int中设置4位半字节的方法
输出应该是这样的: setNibble(0xAAA5,0x1,0); // => 0xAAA1 setNibble(0x56B2,0xF,3); // => 0xF6B2 这就是我写的…… 但是有一些我无法弄清楚的错误 setNibble(FFFF,0): Expected: FFF0 Result: FF00 setNibble(FFFF,6,1): Expected: FF6F Result: 6FF setNibble(1312,E,1): Expected: 13E2 Result: E12 更新:我已经放下了代码.但基本上答案非常明确,上面有很多很好的答案. 解决方法
你非常接近;
public static int setNibble(int num,int nibble,int which) { int output; if(which ==0) { output = (num & /*65280*/ 0xFFFFFFF0 ) | nibble; } else { int shiftNibble = nibble << (4*which) ; int shiftMask = 0x0000000F << (4*which) ; output = (num & ~shiftMask) | shiftNibble ; } return output; } 实际上,您可以简化代码,但要分别处理== 0的情况.事实上,你正在为一个班次而不是一个班次进行权衡.没有太大的区别,代码更清晰,更优雅. public static int setNibble(int num,int which) { int shiftNibble= nibble << (4*which) ; int shiftMask= 0x0000000F << (4*which) ; return ( num & ~shiftMask ) | shiftNibble ; } 掩模的想法是完全清除半字节在结果中占据的相同4个位置.否则,该位置将包含半字节为零的那些位中的垃圾.例如 // Nibble 77776666555544443333222211110000 num= 0b01001010111101010100110101101010 ; nibble= 0b0010 ; // 2 which= 3 ; shiftNibble= 0b00000000000000000010000000000000 ; shiftMask= 0b00000000000000001111000000000000 ; num= 0b01001010111101010100110101101010 ; ~shiftMask= 0b22222222222222210000222222222211 ; num & ~shiftMask= 0b01001010111101010000110101101010 ; // ~~~~ Cleared! ( num & ~shiftMask ) | nibble 0b01001010111101010010110101101010 ; // ~~~~ Fully set; no garbage! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |