加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读