所有的按位操作符的操作数都会被转成补码(two's complement)形式的有符号32位整数。正数的补码是自己本身,负数的补码是取反后加一,所以经过操作运算后的值是补码形式。

描述

  • 按位与( AND) a & b 对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0。
  • 按位或(OR) a | b 对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0。
  • 按位异或(XOR) a ^ b 对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。
  • 按位非(NOT) ~ a 反转操作数的比特位,即0变成1,1变成0。
  • 左移(Left shift) a << b 将 a 的二进制形式向左移 b (< 32) 比特位,右边用0填充。
  • 有符号右移 a >> b 将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位。
  • 无符号右移 a >>> b 将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。

AND

a b a AND b
0 0 0
0 1 0
1 0 0
1 1 1
8 & 9
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
=>
8
-8 & 9
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000 // -8 的补码
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
=>
8

OR

a b a OR b
0 0 0
0 1 1
1 0 1
1 1 1
8 & 9
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
9
-8 & 9
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000 // -8 的补码
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
11111111,11111111,11111111,11111001 // 补码
=>
11111111,11111111,11111111,11111000 // 反码
=>
10000000,00000000,00000000,00000111 //原码
=>
-7

XOR

a b a XOR b
0 0 0
0 1 1
1 0 1
1 1 0
8 & 9
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
0000 0000, 0000 0000, 0000 0000, 0000 0001
=>
1
-8 & 9
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000 // -8 的补码
0000 0000, 0000 0000, 0000 0000, 0000 1001
=>
1111 1111, 1111 1111, 1111 1111, 1111 0001 // 补码
=>
1111 1111, 1111 1111, 1111 1111, 1111 0000 // 反码
=>
1000 0000, 0000 0000, 0000 0000, 0000 1111 //原码
=>
-15

NOT

a NOT a
0 1
1 0
~ 8
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000 // 补码
=>
1111 1111, 1111 1111, 1111 1111, 1111 0110 // 反码
=>
1000 0000, 0000 0000, 0000 0000, 0000 1001 // 原码
=>
-9
~-8
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000 // -8 的补码
=>
0000 0000, 0000 0000, 0000 0000, 0000 0111 // not 8 补码,反码,原码
=>
7

左移

按位移动会先将操作数转换为大端 (big-endian) 表示的 32位整数,

该操作符会将第一个操作数向左移动指定的位数。向左被移出的位被丢弃,右侧用 0 补充。

8 << 3
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
=>
0000 0000, 0000 0000, 0000 0000, 0100 0000
=>
64
-8 << 3
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000
=>
1111 1111, 1111 1111, 1111 1111, 1100 0000
=>
1111 1111, 1111 1111, 1111 1111, 1011 1111
=>
1000 0000, 0000 0000, 0000 0000, 0100 000
=>
-64

右移

该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,拷贝最左侧的位以填充左侧。

8 >> 3
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
=>
0000 0000, 0000 0000, 0000 0000, 0000 0001
=>
1
-8 >> 3
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000
=>
1111 1111, 1111 1111, 1111 1111, 1111 1111
=>
1111 1111, 1111 1111, 1111 1111, 1111 1110
=>
1000 0000, 0000 0000, 0000 0000, 0000 001
=>
-1

无符号右移

该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。即便右移 0 个比特,结果也是非负的?

8 >>> 3
=>
0000 0000, 0000 0000, 0000 0000, 0000 1000
=>
0000 0000, 0000 0000, 0000 0000, 0000 0001
=>
1
-8 >>> 3
=>
1111 1111, 1111 1111, 1111 1111, 1111 1000
=>
0001 1111, 1111 1111, 1111 1111, 1111 1111
=>
0001 1111, 1111 1111, 1111 1111, 1111 1110
=>
0110 0000, 0000 0000, 0000 0000, 0000 001
=>
805306369

用途

想想看linux的文件权限就是这样做到的。简单的数字就可以表示你有什么权限。比如我们有4个状态,A,B,C,D,分别用二进制保存

  • A 0001=> 1
  • B 0010 => 2
  • C 0100 => 4
  • D 1000 => 8

如果你的状态是 A+B+C 那么你的权值就是 (A | B | C ) => 0111 => 7。这个时候做状态判断是就好做了。用D的值和你按位与下,看看值是否为1,就知道你有没有对应的权限

if(8 & your_status){
// your have status
}else{
// your don't have status
}

javascript按位操作符操作以及用途的更多相关文章

  1. javascript 的位操作符转换推断

    var a = "10" | 0; alert(a); alert (typeof a); 结果为10,number. 这就是说这条语句可以将字符串转化为number. 如果: v ...

  2. 按位操作符(Bitwise operators)

    按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...

  3. js中的位运算符 ,按位操作符

    按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制.十六进制或八进制数值.例如,十进制数9,用二进制表示则为1001.按 ...

  4. 为什么不要在 JavaScript 中使用位操作符?

    如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型.在 JavaScript 中的数字类型是不区分什么 Int,F ...

  5. 浅谈JavaScript位操作符

    因为ECMAscript中所有数值都是以IEEE-75464格式存储,所以才会诞生了位操作符的概念. 位操作符作用于最基本的层次上,因为数值按位存储,所以位操作符的作用也就是操作数值的位.不过位操作符 ...

  6. JavaScript 32位整型无符号操作

    在 JavaScript 中,所有整数字变量默认都是有符号整数,这意味着什么呢? 有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数. 数值范围从 -2^ ...

  7. javascript中的操作符详解1

    好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...

  8. javascript运算符——位运算符

    × 目录 [1]二进制 [2]非 [3]与[4]或[5]异或[6]左移[7]右移[8]>>>[9]应用 前面的话 位运算符是非常底层的运算,由于其很不直观,所以并不常用.但是,其速度 ...

  9. 关于JavaScript中的delete操作

    关于JavaScript中的delete操作 看到一道题,是这样的: (function(x){ delete x; return x; })(1); 1 null undefined Error 我 ...

随机推荐

  1. python pytest

    之前一直用unittest ,现在学习pytest 看看那个好 1. 安装 pip install -U pytest py.test --version 2. 只需要按照下面的规则: 测试文件以te ...

  2. 多媒体开发之--- live555 vs2010/vs2013下编译,使用,测试

    Ⅰ live555简介 Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP.RTSP.SIP等的支持.Live555实现了对多种音视频编 ...

  3. Mac Python建立简单的本地服务器

    由于Mac自带Python 所以省去我们去下载了 打开终端  执行python stm-macmini:~ apple$ pythonPython 2.7.10 (default, Jul 14 20 ...

  4. Entity Framework(1)——Connections and Models

    原文:https://msdn.microsoft.com/en-us/data/jj592674 应该选择CodeFirst.ModelFirst还是databaseFirst网上已经很多资料了,这 ...

  5. vs重复编译

    VS用了这么久都没有这样的问题,昨天突然发现在自己电脑时间不对了,就调了下,以后这问题都来了.每次运行项目都要重新编译下,不管改不改底层代码.这让我很痛苦,浪费大量时间,找了好久才得到答案: .时间问 ...

  6. F - Monkey Banana Problem

    F - Monkey Banana Problem Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & ...

  7. .net EF监控 MiniProfiler

    1.从NuGet上下载所需要的包:MiniProfiler.mvc,MiniProfiler,MiniProfiler.ef 2.Global.asax 加入 protected void Appli ...

  8. 基于镜像安装mysql

    准备目录 cd /opt mkdir -p mysql/data mysql/logs mysql/conf 查找MySql镜像版本 docker search mysql 安装指定版本的mysql镜 ...

  9. POJ 286 Y2K Accounting Bug【简单暴力】

    链接: http://poj.org/problem?id=2586 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26733#probl ...

  10. Android开发之深入理解泛型extends和super的区别

    摘要: 什么是泛型?什么是擦除边界?什么是上界限定或下界限定(子类型限定或超类型限定)?什么是类型安全?泛型extends关和super关键字结合通配符?使用的区别,两种泛型在实际Android开发中 ...