关于位运算

2020-02-28  本文已影响0人  leeleeleelalala

进制

所谓进制,就是满几进1的制度,生活中我们不知不觉已经用了很多,12个为一打,这是满12进1;三个月为1季度,这是满3进1。
在搬砖生涯中,我们碰到更多的是二进制,八进制,十进制,以及十六进制。
计算机底层的电子元件只有两种状态,高电平(有电)和低电平(没电),高电平的时候为1,低电平的时候为0,于是二进制应运而生。
那么为啥又有八进制和十六进制呢,因为相比二进制,表示相同的数值时,他们要更短一些,方便阅读和记忆。

计算机中存储单位的换算

8bit = 1byte
1kb = 1024byte
1mb = 1024kb
...
bit是计算机中最小的信号单位,只能表示两种状态,范围太小了,英文字母就有26个,还有其他字符,远远不够
于是就有了byte,它可以表示2的8次方256种,我们所熟知的ASCII码就占一个byte

正码反码补码,草泥..sorry

计算机中所有的有符号数字都是按照补码的形式存储的

1、 正数的原码 = 反码 = 补码
2、 负数呢
       原码 = 符号位 + 数值位(数据的绝对值的32位二进制表示)
       反码 = 符号位不变 + 数值位取反(0->1,1->0)
       补码 = 反码 + 1

让你惊艳的位运算

首先要知道,位运算在计算机里面全部都是用数值的补码进行运算的,运算完之后呈现给我们的是原码

1、按位与&  :都为1才为1
2、按位或|  :有一个1就为1
3、按位异或 ^  :不同才为1
4、按位取反 ~  : 规则见上文反码描述,注意正数的原码反码补码都是它自己
5、左移<<  : 数值x左移n位 = x * 2^n
6、右移>>  : 数值x右移n位 = x / 2^n  (符号位是什么就用什么补充)
7、无符号右移>>>  : 左边空出来的用0补充,于是无符号右移之后,正数还是那个正数,负数就偷偷变了性,成正数了。

为什么要BB这么多?
因为最近疏于学习
没有素材
em...
才不是
位运算的作用老大了,运算效率还特别高,之前研读JDK源码的时候,发现底层很多算法都用到了位运算,特别巧妙和惊艳。

位运算的应用

第一个例子:
利用 a ^ b ^ b == a 的特性,可实现
1、以b作为密钥的简单加密
2、在不利用中间变量的情况下实现两个变量的交换

a = a ^ b
b = a ^ b
a = a ^ b
😊

第二个例子:
利用 x ^ (x - 1),可实现
1、判断一个数x是否是2的整数次幂
利用 res = x & (x-1), res为0 则x是2的整数次幂,否则不是
这是为喵?
试想一下,2的n次幂的二进制表示大概是怎样?是酱:
0000010000,从右向左第(n+1)个位置为1,其他位置都是0
那么,一个(2的n次幂)-1的数的二进制表示又是怎样? 是酱:
0000001111,从右向左第n个位置为1,然后前面0到(n-1)位置是0,n往后都是1
所以如果x是2的整数次幂 是 x & (x-1)=0的充分条件,必要条件也是可以利用上面的思路得证的。

2、判断一个二进制数中有多少个1
要不要自己证明一下?😊

还有很多很多,以后我也会多多学习。

上一篇下一篇

猜你喜欢

热点阅读