JavaScript中位运算符的克隆函数列表?

时间:2016-07-21 18:16:25

标签: javascript math binary bit-manipulation

JavaScript整数最多可达2 ^ 53,但所有位操作最多只能达到2 ^ 32。有时我需要对2 ^ 32和2 ^ 53之间的数字执行位操作,所以我必须为所有位操作编写替换函数:

这是我到目前为止所拥有的:

<link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.common-material.min.css" />
    <link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.material.min.css" />
    <link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.default.mobile.min.css" />

    <script src="//kendo.cdn.telerik.com/2016.2.607/js/jquery.min.js"></script>
    <script src="//kendo.cdn.telerik.com/2016.2.607/js/kendo.all.min.js"></script>

<div class="container" style="">


        <div id="example" role="application" style="">
		    <div id="select" class="demo-section k-content">
           
           
            <select id="size" placeholder="Skills, Designations...." style="" >
              <option />
              <option />to
              <option />code
              <option />way
              <option />always
              <option />easily
            </select>
     
            
        </div>
</div>
        
<div id="example1" role="application" style="">
		    <div id="select" class="demo-section k-content">
           
          
            <select id="size1" placeholder="Location" style="" >
              <option />
              <option />Delhi
              <option />Bangalore
              <option />Jammu and kashmir
              <option />ahmedabad
              <option />Arunachal Pradesh
            </select>
     
            
        </div>
 </div>

<div id="example2" role="application" style="">
		    <div id="select" class="demo-section k-content">
           
           
            <select id="size2" placeholder="Exp(Years)" style="" >
              <option />
              <option />0 Year
              <option />1
              <option />2
              <option />3
              <option />4
            </select>
     
            
        </div>
 </div>


<div id="example3" role="application" style="">
		    <div id="select" class="demo-section k-content">
           
           
            <select id="size3" placeholder="Salary" style="
">
              <option />
              <option />&lt;1 Lac
              <option />2
              <option />3
              <option />4
            </select>
     
            
        </div>
 </div>
</div>





            <script>
                $(document).ready(function() {
                    // create ComboBox from input HTML element
                    
                    // create ComboBox from select HTML element
                    $("#size").kendoComboBox();
 $("#size1").kendoComboBox();
$("#size2").kendoComboBox();
$("#size3").kendoComboBox();
                   
					var select = $("#size").data("kendoComboBox");
var select = $("#size1").data("kendoComboBox");
var select = $("#size2").data("kendoComboBox");
var select = $("#size3").data("kendoComboBox");
				
                });
              </script>

这是实现班次功能的最佳方式吗?

我现在需要实施function lshift(num, bits) { return num * Math.pow(2, bits); } function rshift(num, bits) { return Math.floor(num / Math.pow(2, bits)); } &。在我的代码中,我经常需要| 127和128但我不确定如何这样做。

我不需要&~,但我认为它们可以包含在答案中以便完整。

1 个答案:

答案 0 :(得分:2)

一般性评论:保持所有数字为正,以避免1补充问题似乎是有道理的。

对于lshift函数,我不确定如果移位不会溢出32位而做一些检查是否会得到回报,并且在这种情况下使用常规移位操作:它可能会减少复杂的操作,但它会还添加了支票和分支......

function and(a, b) {
  var low = a & b & 0x7fffffff;
  if (a <= 0x7fffffff || b <= 0x7fffffff) {
    return low;
  }
  var hi = rshift(a, 31) & rshift(b, 31);
  return low + lshift(hi, 31);
}

function or(a, b) {
  var low = (a | b) & 0x7fffffff;
  if (a <= 0x7fffffff && b <= 0x7fffffff) {
    return low;
  }
  var hi = rshift(a, 31) | rshift(b, 31);
  return low + lshift(hi, 31);
}

function xor(a, b) {
  var low = (a ^ b) & 0x7fffffff;
  if (a <= 0x7fffffff && b <= 0x7fffffff) {
    return low;
  }
  var hi = rshift(a, 31) ^ rshift(b, 31);
  return low + lshift(hi, 31);
}

function rshift(num, bits) {
  return num <= 0x7fffffff ? num >> bits : 
      Math.floor(num / Math.pow(2, bits));
}

编辑:修正了或添加xor

中的错误