
前言:位运算是很奇巧的操作,往往可以对某些特殊问题达到意想不到的奇效
破解索引:
-
- 【位运算基础】:⋘一.进制🔑
- ⋘二.计算机中整数如何表示🔑
- ⋘三.原码、补码和反码🔑(看看数字的底层)
- 【位运算算法】:⋙开始✈
- ⋙🛫基本介绍 与、或、异或、取反、左移、右移(&、|、^、~、>>、<<)
- ⋙🛫基本介绍 :位运算性质一览表
- 【位运算奇巧】:⋙超越
- 💥 1.判断非负数的奇偶
- 💥 2.对2^k快速取余
- 💥 3.快速取得某数二进制表示的后n位 或 消除后n位
- 💥 4.快速判断2的幂
- 💥 5用或,设置标记位/用且,置空标记位
- 💥 6.快速乘以/除以2……
- 💥 7.交换变量
- 💥 8.求解只出现一次的数字
- 💥 9.Brian Kernighan 算法(快速去掉二进制表示的最后一位)
- —【位运算超突破】—,唯一⋘:🐉状态压缩✈
- 总结:
【位运算基础】:⋘一.进制🔑
1.进制的基本概念
进制即进位计数制,是利用固定的数学符号和统一的规则的带进位的计数方法。
任何一种进制都有一个基数,基数为X的进制称为X进制,表示每个数位上的数运算时都是逢X进一。
对于一个X进制的数,其具体数值由其中的每个数码和数码所在的数位决定。
整数部分从右往左(第一个数位记为1,增 )的第m个数位具有的权重为X^(m-1);
如:十进制整数1234
| 1234=1×10^3+2×10^2+3×10^1+4×10^0 |
| 0.5678=5×10^-1+5×10^-2+6×10^-3+8×10^-4 |
720.514=7×8^2 + 2×8^1 +0×8^0 +4×8^-1+ 0×8^-2+ 7×8^-3……
2.进制转化的基本方法
非十进制转十进制
——
将非十进制数转成十进制数,只要将每个数位的数乘以该数位的权重,最后相加即可(每个数位的加权和)。
十进制转非十进制
——
将十进制数转成 X进制数,需要对整数部分和小数部分分别转换。
整数:连除取余,直到0
例如,将十进制数 50 转成二进制:
50÷2=25 余 0
25÷2=12 余 1
12÷2=6 余 0
6÷2=3 余 0
3÷2=1 余 1
1÷2=0 余 1
反向遍历每次的余数,依次是 1,1,0,0,1,0
因此十进制数 5050 转成二进制数是110010 (2)
小数:连乘取整,直到1
例如,将十进制数 0.6875 转成二进制:
0.6875×2=1.375 整 1
0.375×2=0.75 整 0
0.75×2=1.5 整 1
0.5×2=1 整 1
正序遍历每次的整数部分,依次是 1,0,1,1
,因此十进制数 0.6875 转成二进制数是0.1011(2)
注意:需要注意的是,在一种进制下的有限小数,转成另一种进制之后可能变成无限循环小数,例如上面的【 720.514 转八进制】
非十进制转非十进制
——
如果需要在两个不同的非十进制之间转换,常规的思路是先转成十进制数,再转成目标进制数。在一些特殊情况下,也可以不经过十进制,直接进行转换。
例如,将二进制数转成八进制数或十六进制数,以及将八进制数或十六进制数转成二进制数,都不需要经过十进制。一位八进制数可以表示成三位二进制数,一位十六进制数可以表示成四位二进制数。
如:101110010(2),按三位一组分:101|110|010,转成八进制数562(8)
⋘二.计算机中整数如何表示🔑
《1》——
计算机中整数统统用二进制表示,只有两个数码0,1
一位二进制的取值共有2个,k位二进制的取值共有2^k个
4 字节数,即32 位二进制数,可能取值有 2^32个;
8 字节数,即 64 位二进制数,可能取值有 2^64个
16 字节数,即 128 位二进制数,可能取值有 2^128个
《2》——
计算机中的数据类型包括有符号类型和无符号类型,有符号类型的整数称为有符号整数,无符号类型的整数称为无符号整数。
(每个数据类型都有对应的无符号、有符号类型两种,
如:int ,unsigned int等,其字节数一致。)
区别:
——
1、有符号整数中,最高位用于表示符号,因此最高位又称符号位。当最高位是 0时表示 0 或正整数,当最高位是 1时表示负整数。除了最高位以外的数位用于表示数字的大小。
2、无符号整数中,所有的数位都用于表示数字的大小,因此无符号整数不存在负数。
以int/unsigned int,4字节数为例.4字节数包含32位二进制数。
对于4字节数的有符号数(int),
当最高位是 0 时,4字节数的取值范围是 【0~2147483647(231-1)】
当最高位是1时,4字节数的取值范围是 【-2147483648(-231) ~ - 1 】
对于4字节数的无符号数(unsigned int)
无符号位,所以其取值范围为:【0~4294967295(232-1)】
《总结》:
1.有符号整数的取值范围包括负整数、零与正整数,
无符号整数的取值范围只包括零与正整数,不包括负整数;
2.在位数相同的情况下,有符号整数可以表示的最大值比无符号整数小了一半;
3.对于二进制位为k的整数,有符号整数的取值范围是 -2^(k-1)~2^(k−1)-1
无符号整数的取值范围是 0 到 2^k .

本文探讨了位运算的基础,包括进制转换、计算机整数表示的原码、补码和反码,以及位运算的六种基本操作:与、或、异或、取反、左移和右移。深入介绍了这些运算在判断奇偶性、快速计算、状态压缩等场景的巧妙应用,是理解和提升编程效率的必备知识。
最低0.47元/天 解锁文章
1894

被折叠的 条评论
为什么被折叠?



