|、&、^、~位运算神算法

二进制

0000 0000 0000 0000

为了表示`正``负`,先辈们就发明了 **原码**,把`左边第一位`腾出来,存放符号,`正数用 0` 来表示,`负用 1` 来表示
复制代码

整数转二进制

关于十进制整数转二进制,其实很简单,记住一个秘诀,就能够了markdown

2 取余,逆序排列
复制代码

就是用 2 整除十进制数,获得商和余数,再用 2 整除商,获得新的商和余数,一直重复直至商等于 0,将先获得的余数做为二进制数的高位,后获得的余数做为二进制数的低位,依次排序便可oop

例如,咱们将十进制 55 转换为 2 进制post

55 % 2 // 商 27 余 1
27 % 2 // 商 13 余 1
13 % 2 // 商 6 余 1
6 % 2 // 商 3 余 0
3 % 2 // 商 1 余 1
1 % 2 // 商 0 余 1
复制代码

取余逆序,那么十进制 55 转 2 进制的结果就是 110111spa

如十进制 55 的 8 位二进制即 00110111,那么可能还会有人为若是是 4 位怎么办呢,4 位是存不了 55 这么大值的,溢出了code

小数转二进制

可能还有人不了解十进制小数是怎么转二进制的,其实也有方法口诀orm

乘 2 取整,顺序排列
复制代码
复制代码

用 2 乘十进制小数,能够获得积,将积的整数部分取出,再用 2 乘余下的小数部分,又获得一个积,再将积的整数部分取出,如此进行,直到积中的整数部分为零,或者整数部分为1,此时 0 或 1 为二进制的最后一位或者达到所要求的精度为止,而后把取出的整数部分按顺序排列起来,先取的整数做为二进制小数的高位有效位,后取的整数做为低位有效位排序

例如,将十进制小数 0.625 转二进制get

0.625 * 2 = 1.250  // 取整数 1
0.25  * 2 = 0.50   // 取整数 0
0.5   * 2 = 1	   // 取整数 1 并结束
复制代码
复制代码

取整顺序,那么十进制小数 0.625 的二进制即为 0.101string

若是该十进制值是一个大于 1 的小数,那么整数部分和小数部分分别取二进制再拼接便可it

例如,将十进制小数 5.125 转二进制

咱们先计算整数 5 的二进制

5 % 2 	// 商  2 余 1
2 % 2 	// 商  1 余 0
1 % 2 	// 商  0 余 1
复制代码
复制代码

那么 5 的二进制即 101,再来看小数部分

0.125 * 2 = 0.250 	// 取整数 0
0.25  * 2 = 0.50  	// 取整数 0
0.5   * 2 = 1		// 取整数 1 并结束
复制代码
复制代码

那么小数部分 0.125 的二进制即 001,拼接可得出十进制数字 5.125 的二进制为 101.001

还会有一种状况,例如十进制小数 0.1 取其二进制

0.1 * 2 = 0.2 	// 取整数 0
0.2 * 2 = 0.4 	// 取整数 0
0.4 * 2 = 0.8 	// 取整数 0
0.8 * 2 = 1.6 	// 取整数 1
0.6 * 2 = 1.2 	// 取整数 1 -> 到此咱们看到开始无限循环了
0.2 * 2 = 0.4 	// 取整数 0
0.4 * 2 = 0.8 	// 取整数 0
...
复制代码
复制代码

那么它的二进制就是 0.0001100...... 这样反复循环,这也引出了咱们在语言层面的问题,例如 JS 中被人诟病的 0.1 + 0.2 != 0.3 的问题,咱们后面再说

上述介绍来源,详细解释请参考-连接地址:juejin.cn/post/689794…

位逻辑运算结果

公式图:

5DDFA0CC-85CE-4d94-A4AF-75719576B5F6.png

位运算:&

12 & 8 结果是 8

0000 0000 0000 1100         12的二进制
&       0000 0000 0000 1000          8的二进制
------------------------------------------------
        0000 0000 0000 1000    结果: 8的二进制


参考公式图,从第一位数一一比对结果,得出结果是8的二进制,转十进制及为8

复制代码

位或运算:|

4 & 8 结果是 12

0000 0000 0000 0100          4的二进制
|       0000 0000 0000 1000          8的二进制
------------------------------------------------
        0000 0000 0000 1100    结果:12的二进制


参考公式图,从第一位数一一比对结果,得出结果是12的二进制,转十进制及为12

复制代码

位异或运算:|

31 & 22 结果是 9

0000 0000 0001 1111          31的二进制
^       0000 0000 0001 0110          22的二进制
------------------------------------------------
        0000 0000 0000 1001    结果: 9的二进制


参考公式图,从第一位数一一比对结果,得出结果是9的二进制,转十进制及为9

复制代码

位取反运算:|

~123 结果是-124

~       0000 0000 0111 1011          123的二进制
------------------------------------------------
        1111 1111 1000 0100    结果: 9的二进制


参考公式图,从第一位数一一比对结果,得出结果是9的二进制,转十进制及为9

复制代码

二进制转十进制

0000 0000 0000 1101
   按位数对应:
    1*2º + 0*2¹ + 1*2² + 1*2³ = 13
复制代码

2的0次方是1(任何数的0次方都是1,0的0次方无心义)\

参考公式: 未标题-1 (1).jpg

相关文章
相关标签/搜索