位运算
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话