关于位运算

在大数据时代,后端数据库压力大,会用到位运算来避免使用数组等需求,则有了位运算的加入,对于前端来说,则需要将位运算转换成需要的值,下面则是记录学习的记录

了解位运算 我们首要要了解二进制与十进制的转换,下面先来复习下二进制转十进制

二进制转十进制 除2 余数法(二进制以0开头)

举例:
   数字:1
    1/2=0...1
    
   所以:1=0001(用最后商+余数,位数不够用0凑齐)
   
   数字:2
   
   2/2=1...0
   所以:2=0010
   
   数字:3
   
   3/2=1...1 
   
   所以:3=0011
   
   数字:4
   
   4/2=2...0
   2/2=1...0
   
   所以:4=0100
   
   数字:5
   
   5/2=2...1
   2/2=1...0
   
   所以:5=0101
   
   ....
   
   数字:12
   
   12/2=6...0
   6/2=3 ...0
   3/2=1 ...1
   
   所以 12=1100
   
   

十进制转二进制(从右往左依次用二进制位上的数字乘以2的n次幂的和(n大于等于0))

 0      0       0     1
 0*2³   0*2²   0*2¹  1*2º
 =0+0+0+1
 =1
 
 以此内推
 0010=0*0+1*2+0*0+0*0=0+2+0+0=2
 0011=1*1+2*1+0*0+0*0=1+2+0+0=3
 0100=0+0+1*4=4
 0101=1+0+4+0=5
 1100=0+0+1*4+1*8=12

复习完以上内容就可以开始了解位运算了

位运算概览:

符号 描述 运算规则

符号 描述 运算规则
& “与” 两个位都为1时,结果才为1
| “或 ” 两个位都为0时,结果才为0
^ “异或” 两个位相同为0,相异为1
~ “取反” 0变1,1变0
<< “左移” 各二进位全部左移若干位,高位丢弃,低位补0

“右移”     各二进位全部右移若干位,高位补0或符号位补齐
前端需求如下
接口中有个返回字段为:
 tags: number; //标签(位图数据):1:置顶,2:精华,4:热门
 
 定义枚举

export enum eGuideTag {
 // TOP = 1, //置顶
 // HOT = 4, //热门
 // ESSENCE = 2, //精华
 TOP = 1 << 0, //置顶
 ESSENCE = 1 << 1, //精华
 HOT = 1 << 2, //热门
}
<div>
<span class="top" v-if="(item.tags & top) == top" />
<span class="sift" v-if="(item.tags & essence) == essence" />
<span class="hot" v-if="(item.tags & hot) == hot" />
</div>

分析:
枚举中的每个值通过 左移运算(1 << n) 生成,对应二进制中的 唯一一位 为 1,其余位为 0:

TOP = 1 << 0:十进制值为 1,二进制为 0001。
ESSENCE = 1 << 1:十进制值为 2,二进制为 0010。
HOT = 1 << 2:十进制值为 4,二进制为 0100。


假设 item.tags=1    0001 & 0001=1 
     item.tags=2    0010 & 0010=0010=2
     item.tags=5    item.tags & top=0101 & 0001=0001=1 
                    item.tags & hot=0100 & 0100=0100=4

    0101 & 0100=0100=4
     0 & 0 =0
     1 & 1 =1
     0 & 0 =0
     1 & 0 =0
     
结论:当tags=1 显示
<span class="top" v-if="(item.tags & top) == top" />
     当tags=2 显示
<span class="sift" v-if="(item.tags & essence) == essence" />
    当tags=5 显示
<span class="top" v-if="(item.tags & top) == top" />
<span class="hot" v-if="(item.tags & hot) == hot" />


同理>>是向右移动

其它

按位与运算符(&)
   0 & 0 = 0
   0 & 1 = 0
   1 & 0 = 0
   1 & 1 = 1
分析: 只有两位同时为1时,结果才为1,否则结果为0。

例如:3 & 5 即 0000 0011 & 0000 0101 = 0000 0001,因此 3 & 5 的值为1。

   0 | 0 = 0
   0 | 1 = 1
   1 | 0 = 1
   1 | 1 = 1
分析: 只要有一个为1,其值为1。

例如:3 | 5 即 0000 0011 | 0000 0101 = 0000 0111,因此 3 | 5 的值为7。

注意:负数按补码形式参与按位或运算。

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
分析:相应位相同为0,相异为1。


取反运算符(~)

~1

原码32位表示:0000 0000 0000 0000 0000 0000 0000 0001 
取反:        1111 1111 1111 1111 1111 1111 1111 1110 
将 0 变 1,1 变 0。

补码转十进制(负数的补码计算)
取反后的二进制是 负数的补码,需转换为十进制

补码转原码:
符号位(最高位)为 1,表明是负数。
对补码除符号位外的所有位取反,再加 1,得到原码

补码:            1111 1111 1111 1111 1111 1111 1111 1110  
取反(除符号位):1000 0000 0000 0000 0000 0000 0000 0001  
加1:             1000 0000 0000 0000 0000 0000 0000 0010  

所以 ~1 = -2

按位取反的本质是:~n = -(n + 1),可通过公式快速验证
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 主题:位运算,java表达目标:复习位运算;刻意练习:无目标读者:能读懂java代码且对位运算不了解的人 # 位运...
    莫愆阅读 398评论 0 0
  • 1:背景 在现代计算机中所有的数据都是以二进制的形式存储在设备中。即0、1两种状态,计算机对二进制数据进行的运算(...
    茉莉儿阅读 11,759评论 4 8
  • iOS位运算 一、二进制 1、什么是二进制 二进制(binary),发现者莱布尼茨[https://baike.b...
    9527abc阅读 218评论 0 0
  • 1. 概述 今天来点概念性的东西,如果在代码中用到位运算和联合体位域,是不是会显得高级一些呢?哈哈。 作为一个开发...
    iOS发呆君阅读 580评论 0 4
  • 进制基本概念 什么是进制?进制是一种计数的方式,数值的表示形式 常见的进制十进制、二进制、八进制、十六进制 进制书...
    极客江南阅读 2,096评论 0 11