在我的系统中,(unsigned char)-1
在二进制(十进制255)中是(预期是8位字符)1111 1111。
类似地,(无符号字符)-1>>1
如预期的0111 1111。左边填满了一个零。
~((unsigned char)-1>>1)
是预期的1000 0000。
例如,现在我想生成未签名的字符0010 0000。
我尝试了~((unsigned char)-1>>1)>>2
,但输出1110 0000....怎么了?为什么左边突然被一个塞满了?
如何生成启用第N位(从左侧开始)的无符号字符
?
我想
n unsigned char
0 1000 0000
1 0100 0000
2 0010 0000
3 0001 0000
...
7 0000 0001
此刻,~((unsigned char)-1>>1)>>n
正在给我
n unsigned char
0 1000 0000
1 1100 0000
2 1110 0000
3 1111 0000
...
7 1111 1111
对于UINT8_T
、UINT16_T
存在此问题,但对于UINT32_T
或更高版本不再发生此问题。
由于通常的算术转换,unsigned char
在进行算术时被提升为int
。即。(unsigned char)-1
具有值255
且类型为unsigned char
。
当向右移位时,左操作数被提升,提升后它将是int
。((unsigned char)-1>>1)
的结果具有值127,因此类型为int
。如果~
(int)127
,您将得到一个带有符号位设置的int
;改变这种权利将产生实现定义的行为。
解决方案是在外部~
周围添加强制转换:
(unsigned char)~((unsigned char) -1 >> 1) >> 2
或者,使用&
包含0xFF
的值。
另一种设置第N位的方法(从左侧开始):
1 << (CHAR_BIT - n - 1)
问题内容: 在将其标记为重复项之前,请阅读以下内容,并检查 我的代码 * 我更新的代码! 所以我的问题是,我必须实现Java / JavaScript’>>>’(无符号右移/零填充右移),但是我无法以完全相同的方式工作。 我选择了在SO和Web上找到的11个最有前途的实现(链接在代码中作为注释添加),并添加了一些测试用例。不幸的是 无 功能返回的Java / JS相同响应的测试ALL。 (也许其中
简单的问题:为什么如果我在Java中对字节变量应用无符号右移(也是短的),它就像int一样威胁它: 控制台输出:
问题内容: 无符号右移运算符在最左边插入0。所以当我这样做 输出 因此,它将在最左边的位中插入0。 输出 不应该是0吗? 问题答案: 参见http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19 如果左侧操作数的提升类型为int,则仅将右侧操作数的最低5位用作移位距离。就像右侧操作数受到掩码值0x1f(0b1111
问题内容: 如何在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)
问题内容: 考虑以下Java代码片段 输出: 预期输出: 怎么样?作为 无符号右移后的二进制形式的b,因此为什么 呢? 问题答案: 问题在于,在进行移位操作之前,所有参数都首先被提升为: 已签名,因此其值为-15。 首先将符号扩展为整数,然后向右移,并通过强制转换为截断为。 首先将符号扩展为整数,然后向右移,并通过强制转换为截断为。 您可以做以获得所需的效果。