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

无符号右移应用于字节变量的行为

廖永长
2023-03-14
问题内容

考虑以下Java代码片段

byte b=(byte) 0xf1;
byte c=(byte)(b>>4);
byte d=(byte) (b>>>4);

输出:

c=0xff
d=0xff

预期输出:

c=0x0f

怎么样?作为1111 0001 无符号右移后的二进制形式的b,0000 1111因此0x0f为什么0xff 呢?


问题答案:

问题在于,int在进行移位操作之前,所有参数都首先被提升为:

byte b = (byte) 0xf1;

b 已签名,因此其值为-15。

byte c = (byte) (b >> 4);

b首先将符号扩展为整数-15 = 0xfffffff1,然后向右移,0xffffffff并通过强制转换为截断0xffbyte

byte d = (byte) (b >>> 4);

b首先将符号扩展为整数-15 = 0xfffffff1,然后向右移,0x0fffffff并通过强制转换为截断0xffbyte

您可以做(b & 0xff) >>> 4以获得所需的效果。



 类似资料:
  • 在我的系统中,在二进制(十进制255)中是(预期是8位字符)1111 1111。 类似地,如预期的0111 1111。左边填满了一个零。 是预期的1000 0000。 例如,现在我想生成未签名的字符0010 0000。 我尝试了,但输出1110 0000....怎么了?为什么左边突然被一个塞满了? 如何生成启用第N位(从左侧开始)的? 我想 此刻,正在给我 对于、存在此问题,但对于或更高版本不再发

  • 简单的问题:为什么如果我在Java中对字节变量应用无符号右移(也是短的),它就像int一样威胁它: 控制台输出:

  • 问题内容: 在将其标记为重复项之前,请阅读以下内容,并检查 我的代码 * 我更新的代码! 所以我的问题是,我必须实现Java / JavaScript’>>>’(无符号右移/零填充右移),但是我无法以完全相同的方式工作。 我选择了在SO和Web上找到的11个最有前途的实现(链接在代码中作为注释添加),并添加了一些测试用例。不幸的是 无 功能返回的Java / JS相同响应的测试ALL。 (也许其中

  • 为什么无符号右移(逻辑右移)和有符号右移(算术右移)对负数产生相同的结果? Android Studio Logcat输出

  • 问题内容: 如何在SQL Server中编写无符号右移运算符?表情就像 这是例如 -5381 >>> 0 = 4294961915 问题答案: T-SQL没有移位运算符,因此您必须自己实现。这里有一个按位移位的实现:http : //dataeducation.com/bitmask- handling-part-4-left-shift-and-right-shift/ 您必须将整数强制转换为v

  • 为了在Swift中实现这一点,我将通过执行以下操作来获取除符号位以外的所有位, 注意数字必须是负数!如果shift操作符溢出,应用程序就会随着EXC_BAD_INSTRUCTION崩溃,这不是很好...另外,我是故意使用Int64的。因为没有更大的数据类型,所以执行类似(1<<63)的操作会溢出Int64并崩溃。因此,我没有在更大的数据类型中执行((1<<63)-1+negativeNumber)