JS中如何让偏移的后的负数转换为正数

将c代码转换为js代码后 由于c中定义的变量为 uint 整型8位类型 运行发现由于JS中没有无法自动转换为整型 出现负数时候后会导致计算失败
我该如何改写js代码,还是将负数转换位整数后再计算 底层算法没算明白 求教导


js右偏移分为 有符号右移**(>>)** 和无符号右移**(>>>)** 两种    而c中只有一种


public static unsafe void crc64(ref Crc64 crc, void* data, uint len)
         {
             uint crc0 = crc.crc0;
             uint crc1 = crc.crc1;
             byte* cdata = (byte*)data;
             while (len-- > 0)
             {
                 int tab_index = ((int)(crc1 >> 24) ^ *cdata++) & 0xFF;
                 var para1 = crc1 << 8;
                 var para0 = crc0 >> 24;
                 crc1 = crc_table1[tab_index] ^ ((crc1 << 8) | (crc0 >> 24)); 
                 crc0 = crc_table0[tab_index] ^ (crc0 << 8);
             }
             crc.crc0 = crc0;
             crc.crc1 = crc1;
         }
//JS代码
crc64 function(buffer) {
    crc64.crc0 = 0xffffffff;
    crc64.crc1 = 0xffffffff;
    var crc0 = crc64.crc0; 
    var crc1 = crc64.crc1; 
    var length = buffer.byteLength;
       for (var i = 0; i < length; i++) {
       var tab_index = ((crc1 >>> 24) ^ (buffer[i])) & 0xFF; 
       crc1 = crc_table1[tab_index] ^ ((crc1 << 8) | (crc0 >>> 24)); 
       crc0 = crc_table0[tab_index] ^ (crc0 << 8);     
                         console.log("tab_index:"+ tab_index + " "+"crc1:"+ crc1 + " "+"crc0:"+ crc0 + " " );    
      }
    crc64.crc0 = crc0;
    crc64.crc1 = crc1;
    
  
    crc64.crc0 ^= 0xffffffff;
    crc64.crc1 ^= 0xffffffff;
    return crc64;
  };  


c运行结果

tab_index:255 crc1:1694702041 crc0:830097927
tab_index:101 crc1:514174325 crc0:374208445
tab_index:30 crc1:2636408049 crc0:2617598120
tab_index:157 crc1:755378055 crc0:1402886864

js运行结果 有负数

tab_index:255 crc1:1694702041 crc0:830097927 
crc64.js:383 tab_index:101 crc1:514174325 crc0:374208445 
crc64.js:383 tab_index:30 crc1:-1658559247 crc0:-1677369176 
crc64.js:383 tab_index:157 crc1:755378055 crc0:1402886864 
crc64.js:383 tab_index:45 crc1:1408777608 crc0:78960684 

https://www.jianshu.com/p/2cb75bfa34b0/

  • 这篇博客: JS判断手机是安卓还是IOS,以及监听软键盘弹出收起中的 JS判断手机是安卓还是IOS,以及监听软键盘弹出收起 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 直接上代码,踩得坑都在代码里

    var u = navigator.userAgent; //获取到的是个字符串,包括很多信息,我只匹配我想要的信息
    var isAnd = u.indexOf("Android") > -1 || u.indexOf("Linux") > -1; //判断是安卓手机
    var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //判断是苹果手机
    if (isAnd) {
    	var oh = document.documentElement.clientHeight || document.body.clientHeight; //获取变化之前的可视区域的高度
    	window.addEventListener("resize", function() {
    		 //resize事件,这里有个小坑,当绑定多个事件是后面的会覆盖前面的事件
    		 //所以我是用addEventListener,绑定多个事件
    		var rh = document.documentElement.clientHeight || document.body.clientHeight;//变化之后的高度
    		if (rh < oh) { 
    			//软键盘弹出
    		} else {
    			//软键盘收起
    		}
    	})
    }
    //苹果中不会触发resize,但是可以用focusin/focusout
    if (isIOS) {
    	document.body.addEventListener("focusin", function() {
    		//软键盘弹出
    	});
    	document.body.addEventListener("focusout", function() {
    		//软键盘收起
    	})
    }
    
  • 以下回答由chatgpt基于相关博客总结生成:

    在JS中将偏移后的负数转换为正数的方法是使用位运算符,将负数转换为无符号整数。具体操作是将负数与无符号整数的最大值相加,得到的结果就是正数。代码如下:

    function negativeToPositive(num){
      return num + Math.pow(2, 32);
    }
    

    比如在代码中,如果需要将-1转换为无符号整数,可以调用函数negativeToPositive(-1),结果为4294967295,即2^32-1,表示无符号整数中最大的数。

你想负数变正数
crc64=crc64%(65536*65536)