HarmonyOS 有关位运算异常

执行以下代码,发现左移24位时就出现异常,这个有什么办法转为正常16进制FF000000,目前使用((0xFF<<24) &0xFFFFFFFF)还是得不到期望的FF000000。

LogUtil.d("左移8:"+(0xFF<<8))//左移8:65280 >> FF00
LogUtil.d("左移16:"+(0xFF<<16))//左移16:16711680 >> FF0000
LogUtil.d("左移24:"+(0xFF<<24))//左移24:-16777216 >> FFFFFFFFFF000000
LogUtil.d("左移32:"+(0xFF<<32))//左移32:255 >> FF
HarmonyOS
3天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

关于二进制数向左位移<<,先转成补码再左移运算,得到的值当成补码求原码。

左移过程中会把符号位也当普通数值位移(即符号位参与左移)

比如:255<<24 左移24位

0000 0000 0000 0000 0000 0000 1111 1111 255的原码

0000 0000 0000 0000 0000 0000 1111 1111 255的反码

0000 0000 0000 0000 0000 0000 1111 1111 255的补码

1111 1111 0000 0000 0000 0000 0000 0000 左移24位之后的值(注意最高位符号位0也被位移了,左移会把符号位当成普通数值操作,左移超过int32位的数值将被直接舍弃)

1111 1110 1111 1111 1111 1111 1111 1111 把左移的值当成补码来算反码,因为左移后的最高位符号位已经变成1是负数了,所以算反码就应该-1来计算(这里是要看符号位来算反码原码的)

1000 0001 0000 0000 0000 0000 0000 0000 继续求反得出原码,此时再转十进制就是返回值-16777216

255<<24=-16777216

所以本身结果也是没问题的,符号位溢出了。

做无符号右移即可。

console.debug("左移24:"+ 0xFF000000+'==='+((0xFF<<24)>>> 0)) 

打印

A03d00/JSAPP                   pid-16909             D     左移24:4278190080===4278190080
分享
微博
QQ
微信
回复
3天前
相关问题
HarmonyOS 运算问题
30浏览 • 1回复 待解决
HarmonyOS 有关异步操作
226浏览 • 1回复 待解决
HarmonyOS 有关共享库的问题
489浏览 • 1回复 待解决
HarmonyOS 有关经纬度问题
63浏览 • 1回复 待解决
HarmonyOS 有关地图轨迹的问题
45浏览 • 1回复 待解决
有关 Ability 使用问题
339浏览 • 1回复 待解决
HarmonyOS 怎么保留两小数
25浏览 • 1回复 待解决
HarmonyOS Webview有关位置管理的示例
404浏览 • 1回复 待解决
有关harmony next的问题
257浏览 • 0回复 待解决
HarmonyOS 小数点如何保留两
45浏览 • 1回复 待解决
HarmonyOS TextInput输入保留三小数
30浏览 • 1回复 待解决
有关深色模式开发的文档
1713浏览 • 1回复 待解决
有关FA的多端适配问题
6276浏览 • 1回复 待解决
请教 sql 有关分组聚合问题?
3333浏览 • 1回复 待解决
是否有关闭整个App的API
897浏览 • 1回复 待解决
HarmonyOS 浮点数如何保留1小数
1040浏览 • 1回复 待解决