我们需要提出一种在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
。实际上,您需要权衡if
a和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 /按位运算符。
问题内容: 是否总是真的(这是我的理解是对的代名词)是个字节? 我可以依靠吗?如果不是这样,那么对于基于POSIX的操作系统是否正确? 问题答案: 除了之外,标准没有关于任何整数类型的确切大小。通常,在32位系统上为32位,在64位系统上为64位。 但是,该标准并未指定 最小 尺寸。从C标准的 5.2.4.2.1节开始: 1 以下给出的值应被适合用于预处理指令的常量表达式代替。此外,除了和之外,以
问题内容: 我将开始处理需要读取字节并创建字符串的内容。读取的字节代表UTF-16字符串。因此,为了进行测试,我想将UTF-16编码的简单字节数组转换为字符串。数组中的前2个字节必须表示字节序,因此必须为0xff 0xfe或0xfe 0xff。所以我尝试如下创建字节数组: 但是我收到一个错误,因为0xFF和0xFE太大而无法容纳一个字节(因为字节是用Java签名的)。更准确地说,错误是int无法转
问题内容: 实际上,我需要将值与过孔一起转移。.现在我的问题是我需要将a。转移为 单个 值.. tat是否可以 转换 为 单个 值..并在那里检索它…我尝试了 铸造 的事情,但它不是有用。如果我的做法是正确的只是帮助我这个,或者说一些其他的方式。 (每次使用铸造时,返回的都是65535) 问题答案: 那这个呢? 和
C 中的 Integer 变量是占用 2 个字节还是 4 个字节?它所依赖的因素是什么? 大部分教材都说整型变量占用2个字节。但是当我运行一个程序,打印一个整数数组的连续地址时,它显示了4的差异。