位运算:
位运算符包括: 与(&)、非(~)、或(|)、异或(^)
&:当两边操作数的位同时为1时,结果为1,否则为0。如1100&1010=1000
| :当两边操作数的位有一边为1时,结果为1,否则为0。如1100|1010=1110
~:0变1,1变0
^:两边的位不同时,结果为1,否则为0.如1100^1010=0110
位移动运算符:
<<表示左移, 左移一位表示原来的值乘2.
例如:3 <<2(3为int型)
1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,
2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,
3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,
转换为十进制是12。
同理,>>表示右移. 右移一位表示除2.
位操作符(bitwise operators)
我们大多数人都知道在JS中存在一些位操作符。每个数值都拥有二进制的表现形式,而这些位操作符就可以用在二进制数值的计算上。检查整型数值的二进制值,我们可以传基本参数“2”给toString()方法:
var number = 5;
var result = number.toString(2);
// In case we want to change the number directly, not
// a variable with a number value, we need to use two
// dots - it's equivalent of 14.0.toString where we can
// show that decimal part of the number is equal to 0.
//如果我们想要直接转换数值(并非是数值变量),我们需要两个‘.’-这相当于14.0.toString,数值的小数部分等于0
var result2 = 13..toString(2);
document.getElementById('result').innerHTML = result + ', ' + result2;
Result: 101, 1101
还有一些不同的操作符。假设,我们有一个变量a 等于5,b等于13,下面是示例:(注:十进制在进行位操作隐式转换为二进制,以下示例是以变量的二进制来进行说明的)
http://www.gbtags.com/gb/debug/96aa31cd-7aeb-49f2-9bbc-7a31310b89cf.htm
代码如下:
Result: <p>a | b = <span id="or"></span></p> <p>a & b = <span id="and"></span></p> <p>a ^ b = <span id="xor"></span></p> <p>~ a = <span id="not"></span></p> <p>a >> b = <span id="rs"></span></p> <p>a << b = <span id="ls"></span></p> <p>a >>> b = <span id="zfrs"></span></p> // helper function for displaing results var output = function(operator, result) { document.getElementById(operator).innerHTML = result; }; // variables var a = 5; var b = 13; // a | b - OR // if in any of the given numbers corresponding bit // is '1', then the result is '1' output('or', a|b); // 13 // a & b - AND // if in both of the given numbers corresponding bit // is '1', then the result is '1' output('and', a&b); // 5 // a ^ b - XOR // if in one of the given numbers (not both) // corresponding bit is '1', then the result is '1' output('xor', a^b); // 8 // ~a - NOT // inverts all the bits output('not', ~a); // -6 // a >> b - RIGHT SHIFT // shift binary representation of 'a' for 'b' // bits to the right, discarding bits shifted off output('rs', a>>b); // 0 // a << b - LEFT SHIFT // shift binary representation of 'a' for 'b' // bits to the right, shifting in zeros from the right output('ls', a<<b); // 40960 // a >>> b - ZERO FILLED RIGHT SHIFT // shift binary representation of 'a' for 'b' // bits to the right, discarding bits shifted off, // and shifting in zeros from the left. output('zfrs', a>>>b); // 0
有时候我们可以用位运算符“|”来代替Math.floor(),Math.floor()可以获得一个数的整数部分,而不是四舍五入.
var data = 2.2352524535;
var result = data | 0;
document.getElementById('result').innerHTML = result;
Result: 2
在真实的场景中,我们可以如何运用位操作符呢? 举个例子,我们可以转换RGB颜色值为十六进制的形式:
// helper function for displaing results var output = function(operator, result) { document.getElementById(operator).innerHTML = result; } // variables var color = {r: 186, g: 218, b: 85}; // RGB to HEX var rgb2hex = function(r, g, b) { return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).substr(1); } output('color', rgb2hex(color.r, color.g, color.b));
我们可以找出两个数中的最大值或最小值
// helper function for displaing results var output = function(operator, result) { document.getElementById(operator).innerHTML = result; } // variables var a = 9285; var b = 3569; // a ^ ((a ^ b) & -(a < b)) - which one, a or b, is bigger? output('max', a ^ ((a ^ b) & -(a < b))); // b ^ ((a ^ b) & -(a < b)) - which one, a or b, is smaller? output('min', b ^ ((a ^ b) & -(a < b)));
由于现在js的math库优化得足够好了,用这些hack在执行效率上没有任何意义。
再来看看两个变量交换。普通的解决方案是创建一个临时变量来达到目的,但这真的没有效率!采用位运算更简单:
// helper function for displaing results var output = function(operator, result) { document.getElementById(operator).innerHTML = result; } // variables var a = 10; var b = 99; // a^=b, b^=a, a^=b - swap variables using XOR operation, // details: http://en.wikipedia.org/wiki/XOR_swap_algorithm a^=b, b^=a, a^=b; output('a', a); output('b', b);
即使在javascript1.7中引入了'Pythonish'变量交换方式,但位运算依旧是最快的.
学习位运算更多技巧打造js app的好地方:Sean Eron Anderson's site [Stanford PhD].
附js技巧:
使用'!!'代替'? true : false'更为简洁.
相关推荐
ECMAScript中的数值都以IEEE-754 64位格式存储,但位操作符是以32位带符号的整数形式进行运算的,并且返回的结果也是一个32位带符号的整数。这种位数转换意味着在对特殊的`NaN`和`Infinity`值应用位操作时,这些值...
前面的话 位运算符是非常底层的运算,由于其很不直观,所以并不常用。...如果对非数值应用位操作符,会先使用Number()将该值转换成数值再应用位操作,得到的结果是一个数值 //'|'表示按位或,一个整数与
1. **基础语法**:JavaScript的基础包括变量声明(var、let、const)、数据类型(Number、String、Boolean、Null、Undefined、Object、Symbol)、操作符(算术、比较、逻辑、位操作、三元运算符)以及流程控制语句...
)、位操作符等。还有赋值操作符,如+=、-=、*=等,用于简化赋值操作。 4. 语句:包括条件语句(如if...else、switch)、循环语句(如for、while、do...while)、跳转语句(如break、continue)、声明语句(如var、...
- **操作符**:如算术、比较、逻辑和赋值操作符,以及特殊的位操作符。 2. **控制流与函数** - **流程控制**:包括条件语句(if...else)、循环(for、while、do...while)和跳转语句(break、continue)。 - **...
2. 操作符:包括算术操作符、比较操作符、逻辑操作符、位操作符、赋值操作符和三元运算符。这些操作符用于执行计算、比较、逻辑判断以及变量的赋值。 3. 语句:如控制流程语句(if...else、switch)、循环语句(for...
- **位操作符**:对数字的二进制位进行操作,如按位与(`&`)、按位或(`|`)、按位异或(`^`)等。 ##### 2.2 自动类型转换 JavaScript是一种弱类型的语言,这意味着它会在某些情况下自动转换数据类型以适应运算的需求...
文档的原始作者包括两位StackOverflow用户——伊沃·韦特泽尔 (Ivo Wetzel) 和 张易江 (Zhang YiJiang),其中前者负责撰写,后者负责设计。此外,还有多名贡献者参与了拼写校对、语言修正等工作,例如Caio Romão和...
- **操作符与表达式**:讲解JavaScript中的各种操作符,包括算术运算符、比较运算符、逻辑运算符等。 - **流程控制**:介绍条件语句(if...else)、循环结构(for、while)等控制流程的方法。 - **函数**:讨论函数...
JavaScript是一种广泛应用于网页和网络应用开发的编程语言,它在客户端运行,为用户提供实时交互体验。在这个基于JavaScript的贷款计算器项目中,我们主要探讨以下几个关键知识点: 1. **DOM操作**:HTML(文档对象...
1. **基础语法**:变量声明(var, let, const)、数据类型(字符串、数字、布尔、null、undefined、对象、数组、函数)、操作符(算术、比较、逻辑、位操作、赋值、条件)、流程控制(if...else、switch、循环、...
3. **词法结构**:详细解析JavaScript的语法基础,包括注释、标识符、字符串、模板字面量、字面量表示法、行终止符等,以及如何编写整洁且易于理解的代码。 4. **数据类型**:涵盖JavaScript的七种数据类型,即原始...
### JavaScript王者归来——核心知识点梳理 #### 第一部分:概论 **第1章:从零开始** - **1.1 为什么选择JavaScript?** - **1.1.1 用户的偏好--B/S模式** - 强调了浏览器/服务器(B/S)架构的重要性,解释为何...
通过JavaScript的事件监听和DOM操作,可以实时更新页面上的货币数值,提高用户体验。 为了进一步优化性能和兼容性,开发者在使用currency.js时需要注意与其它库的兼容性问题,避免冲突。同时,考虑到移动设备和不同...
- `typeof`操作符用于获取一个值的类型时,如果该值未定义,则结果为`undefined`。 2. **Null** - `null`表示“无”或者“空”的值。 - `null`与`undefined`在某些情况下被认为是相等的(使用宽松比较运算符`==`...
JavaScript是一种广泛应用于网页和网络应用的编程语言,尤其在...随着学习深入,你还将接触到变量、操作符、流程控制、函数、对象、模块等更复杂的概念。通过不断实践和探索,你将能更好地理解和运用这门强大的语言。
本资源包含两部分——“JavaScript语言参考手册”和“JavaScript源码大全”,将帮助你深入理解和掌握这门语言。 《JavaScript语言参考手册》通常会涵盖以下内容: 1. **基础语法**:包括变量、数据类型(如字符串...
总结来说,这个"网页模板——原生JS实现的人民币数字大写转换特效源码"涉及到的JavaScript技术包括字符串处理、条件判断、数据映射、金额格式化和错误处理等,这些都是前端开发中不可或缺的基础技能。通过学习和使用...
在JavaScript中,正则表达式被封装在`RegExp`对象中,可以通过一系列特殊字符(元字符)和操作符来定义匹配规则。 ##### 2.1 元字符 - **`.`**:匹配除换行符外的任意单个字符。 - **`\d`**:匹配任意数字(等同于...
2.5.7 位操作表达式 40 2.5.8 运算符的优先级 41 2.6 特殊的全局变量的介绍 42 2.7 文件包含 42 2.7.1 使用require和require_once语句 2.7.1 进行文件包含 42 2.7.2 使用include与include_once语句 2.7.2 进行文件...