`

javascript —— 位操作符应用

阅读更多

位运算:

位运算符包括: 与(&)、非(~)、或(|)、异或(^)

&:当两边操作数的位同时为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'更为简洁.

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    javascript运算符——位运算符全面介绍.docx

    ECMAScript中的数值都以IEEE-754 64位格式存储,但位操作符是以32位带符号的整数形式进行运算的,并且返回的结果也是一个32位带符号的整数。这种位数转换意味着在对特殊的`NaN`和`Infinity`值应用位操作时,这些值...

    javascript运算符——位运算符全面介绍

    前面的话 位运算符是非常底层的运算,由于其很不直观,所以并不常用。...如果对非数值应用位操作符,会先使用Number()将该值转换成数值再应用位操作,得到的结果是一个数值 //'|'表示按位或,一个整数与

    JavaScript应用程序经典实例全书源码

    1. **基础语法**:JavaScript的基础包括变量声明(var、let、const)、数据类型(Number、String、Boolean、Null、Undefined、Object、Symbol)、操作符(算术、比较、逻辑、位操作、三元运算符)以及流程控制语句...

    javascript简介

    )、位操作符等。还有赋值操作符,如+=、-=、*=等,用于简化赋值操作。 4. 语句:包括条件语句(如if...else、switch)、循环语句(如for、while、do...while)、跳转语句(如break、continue)、声明语句(如var、...

    Java Script 经典教程(七)——JavaScript用户指南

    - **操作符**:如算术、比较、逻辑和赋值操作符,以及特殊的位操作符。 2. **控制流与函数** - **流程控制**:包括条件语句(if...else)、循环(for、while、do...while)和跳转语句(break、continue)。 - **...

    JavaScript 语言参考

    2. 操作符:包括算术操作符、比较操作符、逻辑操作符、位操作符、赋值操作符和三元运算符。这些操作符用于执行计算、比较、逻辑判断以及变量的赋值。 3. 语句:如控制流程语句(if...else、switch)、循环语句(for...

    Eloquent-JavaScript.pdf

    - **位操作符**:对数字的二进制位进行操作,如按位与(`&`)、按位或(`|`)、按位异或(`^`)等。 ##### 2.2 自动类型转换 JavaScript是一种弱类型的语言,这意味着它会在某些情况下自动转换数据类型以适应运算的需求...

    JavaScript_秘密花园

    文档的原始作者包括两位StackOverflow用户——伊沃·韦特泽尔 (Ivo Wetzel) 和 张易江 (Zhang YiJiang),其中前者负责撰写,后者负责设计。此外,还有多名贡献者参与了拼写校对、语言修正等工作,例如Caio Romão和...

    《JavaScript语言精粹》PDF高清扫描版

    - **操作符与表达式**:讲解JavaScript中的各种操作符,包括算术运算符、比较运算符、逻辑运算符等。 - **流程控制**:介绍条件语句(if...else)、循环结构(for、while)等控制流程的方法。 - **函数**:讨论函数...

    基于JavaScript的贷款计算器

    JavaScript是一种广泛应用于网页和网络应用开发的编程语言,它在客户端运行,为用户提供实时交互体验。在这个基于JavaScript的贷款计算器项目中,我们主要探讨以下几个关键知识点: 1. **DOM操作**:HTML(文档对象...

    JavaScript参考手册大全合集.chm

    1. **基础语法**:变量声明(var, let, const)、数据类型(字符串、数字、布尔、null、undefined、对象、数组、函数)、操作符(算术、比较、逻辑、位操作、赋值、条件)、流程控制(if...else、switch、循环、...

    JavaScript 权威指南(第四版)

    3. **词法结构**:详细解析JavaScript的语法基础,包括注释、标识符、字符串、模板字面量、字面量表示法、行终止符等,以及如何编写整洁且易于理解的代码。 4. **数据类型**:涵盖JavaScript的七种数据类型,即原始...

    JavaScript王者归来(目录)

    ### JavaScript王者归来——核心知识点梳理 #### 第一部分:概论 **第1章:从零开始** - **1.1 为什么选择JavaScript?** - **1.1.1 用户的偏好--B/S模式** - 强调了浏览器/服务器(B/S)架构的重要性,解释为何...

    网页模板——JS处理货币格式浮点数插件currency.js.zip

    通过JavaScript的事件监听和DOM操作,可以实时更新页面上的货币数值,提高用户体验。 为了进一步优化性能和兼容性,开发者在使用currency.js时需要注意与其它库的兼容性问题,避免冲突。同时,考虑到移动设备和不同...

    JavaScript经典之作

    - `typeof`操作符用于获取一个值的类型时,如果该值未定义,则结果为`undefined`。 2. **Null** - `null`表示“无”或者“空”的值。 - `null`与`undefined`在某些情况下被认为是相等的(使用宽松比较运算符`==`...

    JAVASCRIPT学习第一季

    JavaScript是一种广泛应用于网页和网络应用的编程语言,尤其在...随着学习深入,你还将接触到变量、操作符、流程控制、函数、对象、模块等更复杂的概念。通过不断实践和探索,你将能更好地理解和运用这门强大的语言。

    JavaScript语言参考手册+源码大全

    本资源包含两部分——“JavaScript语言参考手册”和“JavaScript源码大全”,将帮助你深入理解和掌握这门语言。 《JavaScript语言参考手册》通常会涵盖以下内容: 1. **基础语法**:包括变量、数据类型(如字符串...

    网页模板——原生JS实现的人民币数字大写转换特效源码.zip

    总结来说,这个"网页模板——原生JS实现的人民币数字大写转换特效源码"涉及到的JavaScript技术包括字符串处理、条件判断、数据映射、金额格式化和错误处理等,这些都是前端开发中不可或缺的基础技能。通过学习和使用...

    Javascript的表单验证-揭开正则表达式的面纱_.docx

    在JavaScript中,正则表达式被封装在`RegExp`对象中,可以通过一系列特殊字符(元字符)和操作符来定义匹配规则。 ##### 2.1 元字符 - **`.`**:匹配除换行符外的任意单个字符。 - **`\d`**:匹配任意数字(等同于...

    php网络开发完全手册

    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 进行文件...

Global site tag (gtag.js) - Google Analytics