位运算

a << b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 << 2 = 400。可以看出,a << b的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以2。
通常认为a << 1比a * 2更快,因为前者是更底层一些的操作。因此程序中乘以2的操作请尽量用左移一位来代替。
定义一些常量可能会用到<<运算。你可以方便地用1 << 16 - 1来表示65535。很多算法和数据结构要求数据规模必须是2的幂,此时可以用<<来定义Max_N等常量。

和<<相似,a >> b表示二进制右移b位(去掉末b位),相当于a除以2的b次方(取整)。我们也经常用>> 1来代替div 2,比如二分查找、堆的插入操作等等。想办法用>>代替除法运算可以使程序效率大大提高。最大公约数的二进制算法用除以2操作来代替慢得出奇的mod运算,效率可以提高60%。

常用位运算有:

 位与  &  (1&1=1 1&0=0  0&0=0)   

& 与运算 两个位都是 1 时,结果才为 1,否则为 0,如
1 0 0 1 1
& 1 1 0 0 1
------------------------------
1 0 0 0 1

 

位或  |   (1|1=1  1|0=1 0|0=0)

或运算 两个位都是 0 时,结果才为 0,否则为 1,如
1 0 0 1 1
 1 1 0 0 1
------------------------------
1 1 0 1 1

 

 位非  ~   ~1=0  ~0=1

~ 取反运算,0 则变为 1,1 则变为 0,如
~ 1 0 0 1 1
-----------------------------
0 1 1 0 0

 位异或  ^   (1^1=0  1^0=1  0^0=0)             所以从异或的特点可以得出两个结论:n^n=0,n^0=1。

^ 异或运算,两个位相同则为 0,不同则为 1,如
1 0 0 1 1
^ 1 1 0 0 1
-----------------------------
0 1 0 1 0

 

 <<有符号左移     >>有符号的右移    >>>无符号右移  例如:8 << 2 = 32 8>>2 = 2  表时8左移两位,8 << 3则表示8左移3位,

有符号右移和无符号右移的区别?

>> 表示右移,如果该数知为正,则高位补0,若为负数,则高位补1。

>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,高位同样补0。

 

在hashmap 中定位元素用到   static int indexFor(int h, int length) {
                     return h & (length-1);
                }

h是哈希值,lenght是table长度,其实,就是对数组进行取模。原理如下:X % 2^n = X & (2^n - 1),因为hashmap中length 初始为16,每次扩充原来的2倍,每次长度都是2^n,所以取模等于X & (2^n - 1)。

X % 2^n 二进度上讲是将X往右移动 n步被丢掉的部分。举两个例子:(可以参考这个  https://cloud.tencent.com/developer/article/1462636)

6 % 8 = 6 --->6 & 7 = 6

10 % 8 = 2--->10 & 7 = 2

Java之所有使用位运算(&)来代替取模运算(%),最主要的考虑就是效率。。

发现一个二进制快速转十进制的方法:

比如二进制 100 转十进制就是2^2+0+0=4 

比如二进制 101010 转十进制就是2^5+0+2^3+0+2^1+0=42

比如二进制 1011011 转十进制就是2^6+0+2^4+2^3+0+2^1+2^0=91

 一个二进制10---->1是高位 0是低位 ,从低往高也就是从右往左算 如果本位是1,则用2^索引,如果是0就用0表示,然后串起来相加就是十进制值。

32位和64位系统 分别指32bit和64bit 1字节=8bit。

字节顺序:字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。

 1GB=1024MB  1MB=1024KB  1KB=1024Byte  1Byte=8bit

 

 

posted @   亢🐉有悔  阅读(478)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示