当前位置: 首页 > 面试题库 >

将4位半字节设置为int类型

许波涛
2023-03-14
问题内容

我们需要提出一种在int输出中设置4位半字节的方法,如下所示:

 setNibble(0xAAA5, 0x1, 0); // => 0xAAA1
 setNibble(0x56B2, 0xF, 3); // => 0xF6B2

这就是我写的

但是有什么错误我无法弄清楚

setNibble(FFFF, 0, 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;
    }

实际上,您可以简化代码,但要以区分大小写为代价which == 0。实际上,您需要权衡ifa和shift
not。根本没有什么区别,并且代码更清晰,更优雅。

    public static int setNibble(int num, int nibble, 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=       0b11111111111111110000111111111111 ;  
    num & ~shiftMask= 0b01001010111101010000110101101010 ;
    //                                  ~~~~  Cleared!
    ( num & ~shiftMask ) 
      | nibble        0b01001010111101010010110101101010 ;
    //                                  ~~~~  Fully set; no garbage!


 类似资料:
  • 问题内容: 我需要将缓冲区的长度存储在4个字节大的字节数组中。 伪代码: 做到这一点的最佳方法是什么?请记住,稍后我必须将该字节数组转换回整数。 问题答案: 您可以使用以下方式将其转换为字节: 注意,这样做时可能必须考虑字节顺序。

  • 问题内容: 我正在尝试在Java字节变量中设置位。它确实提供了类似的适当方法。有人知道我该怎么实现吗? 我可以逐位遍历给定的字节: 但是我不能将此位置设置为1或0,可以吗? 问题答案: 使用按位 OR ()和 AND ()运算符。要设置一点,即将其转到: 取消设置或将其转到: 有关示例,请参见高级Java /按位运算符。

  • 问题内容: 我将开始处理需要读取字节并创建字符串的内容。读取的字节代表UTF-16字符串。因此,为了进行测试,我想将UTF-16编码的简单字节数组转换为字符串。数组中的前2个字节必须表示字节序,因此必须为0xff 0xfe或0xfe 0xff。所以我尝试如下创建字节数组: 但是我收到一个错误,因为0xFF和0xFE太大而无法容纳一个字节(因为字节是用Java签名的)。更准确地说,错误是int无法转

  • 问题内容: 实际上,我需要将值与过孔一起转移。.现在我的问题是我需要将a。转移为 单个 值.. tat是否可以 转换 为 单个 值..并在那里检索它…我尝试了 铸造 的事情,但它不是有用。如果我的做法是正确的只是帮助我这个,或者说一些其他的方式。 (每次使用铸造时,返回的都是65535) 问题答案: 那这个呢? 和

  • 问题内容: 是否总是真的(这是我的理解是对的代名词)是个字节? 我可以依靠吗?如果不是这样,那么对于基于POSIX的操作系统是否正确? 问题答案: 除了之外,标准没有关于任何整数类型的确切大小。通常,在32位系统上为32位,在64位系统上为64位。 但是,该标准并未指定 最小 尺寸。从C标准的 5.2.4.2.1节开始: 1 以下给出的值应被适合用于预处理指令的常量表达式代替。此外,除了和之外,以

  • C 中的 Integer 变量是占用 2 个字节还是 4 个字节?它所依赖的因素是什么? 大部分教材都说整型变量占用2个字节。但是当我运行一个程序,打印一个整数数组的连续地址时,它显示了4的差异。