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
2024-12-23 16:09:06
浏览
收藏 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
微信
回复
2024-12-23 18:35:31
相关问题
HarmonyOS 运算问题
293浏览 • 1回复 待解决
HarmonyOS 数据库查询是否支持运算
395浏览 • 1回复 待解决
16进制数按与结果异常
314浏览 • 1回复 待解决
HarmonyOS 有关异步操作
458浏览 • 1回复 待解决
HarmonyOS 有关共享库的问题
809浏览 • 1回复 待解决
HarmonyOS ArkTS中运算符重载怎么写
287浏览 • 1回复 待解决
有关 Ability 使用问题
696浏览 • 1回复 待解决
HarmonyOS 有关地图轨迹的问题
309浏览 • 1回复 待解决
HarmonyOS 有关经纬度问题
442浏览 • 1回复 待解决
HarmonyOS 有关多线程的资料文档
399浏览 • 1回复 待解决
有关harmony next的问题
569浏览 • 0回复 待解决
HarmonyOS Webview有关位置管理的示例
684浏览 • 1回复 待解决
请教 sql 有关分组聚合问题?
3555浏览 • 1回复 待解决
有关深色模式开发的文档
2077浏览 • 1回复 待解决
有关FA的多端适配问题
6748浏览 • 1回复 待解决
是否有关闭整个App的API
1136浏览 • 1回复 待解决
HarmonyOS 怎么保留两小数
393浏览 • 1回复 待解决