二进制
基本概念
- 二进制是基数为
2的数值,只包含了两个数字:0和1。 - 计算机使用二进制是因为硬件(如晶体管)只能表示两种状态:开(1)和关(0)。
- 二进制中的每一位称为一个 比特(bite),
8个比特组成一个 字节(byte)。
进制转换
二转十:
方法:按权展开,逐位相加。
公式:
例如:
二转十:
方法:取2余法。
步骤:
- 将十进制不断除以2,记录余数。
- 将余数逆序排序,得到二进制。
示例:
逆序排序之后得到结果:1011。
二转十六:
十六进制转换为十进制是计算机科学和编程中的一个常见任务。十六进制是一种基数为16的数制,使用数字0-9和字母A-F来表示数值。在十六进制中,A代表10,B代表11,C代表12,D代表13,E代表14,F代表15。
示例:
1A3(十六进制) = 1 * 16^2 + A * 16^1 + 3 * 16^0
= 1 * 256 + 10 * 16 + 3 * 1
= 256 + 160 + 3
= 419(十进制)然后将419转为二进制即可。
二转八:
位运算
位运算是直接对二进制数的每一位直接进行操作,常用于底层编程,性能优化和算法设计。
基本位运算符
与(AND):&
规则:两位都为1时,结果位1;否则为0。
示例:
1010 & 1100 = 1000或(OR):
规则:两位不同时,结果为1,否则为0。
示例:
1010 | 1100 = 1110异或(XOR):
规则:两位不同时,结果为1,否则为0。
示例:
1010 ^ 1100 = 0110。非(NOT):
~规则:对每一位取反。
示例:
~1010 = 0101(假设为4位)左移(Left Shift):
<<规则:将二进制数向左移动指定位数,右侧补0。
示例:
1010 << 2 = 101000右移(Right Shift):
>>规则:将二进制数向右移动指定位数,左侧补符号位(算术右移)或补0(逻辑右移)。
示例:
1010 >> 2 = 0010
位运算的应用:
快速乘除:
左移一位相当于乘以2,右移一位相当于除以2。
示例:
5 << 1 = 10,相当于5 * 2,10 >> 2 = 5相当于(10 /2)掩码操作:
使用位运算提取或设置特定位。
示例:提取低4位:
x & 0xF。交换变量:
使用异或运算交换两个变量的值,无需临时变量。
typescriptlet a = 5, b = 10; a = a ^ b; b = a ^ b; a = a ^ b; console.log(a, b); // 输出:10, 5判断奇偶性:
使用
&运算判断一个数是否为偶数。示例:
typescriptlet x = 1; if (x & 1) { console.log(`x 是奇数`); } else { console.log(`x 是偶数`); }
位运算在计算机编程中的应用
位掩码:
位掩码是一种使用二进制位表示状态的技术,常用于优化存储和操作多个布尔值。
示例:
typescriptconst FLAG_A = 1 << 0; // 0001 const FLAG_B = 1 << 1; // 0010 const FLAG_C = 1 << 2; // 0100 let flags = 0; flags |= FLAG_A; // 设置 FLAG_A flags |= FLAG_B; // 设置 FLAG_B console.log(flags & FLAG_A ? "FLAG_A 已设置" : "FLAG_A 未设置"); // 输出:FLAG_A 已设置权限控制
使用二进制位表示不同的权限,通过位运算进行权限的检查和设置。
示例:
typescriptconst READ = 1 << 0; // 0001 const WRITE = 1 << 1; // 0010 const EXECUTE = 1 << 2; // 0100 let userPermissions = READ | WRITE; // 用户有读和写权限 console.log(userPermissions & READ ? "可读" : "不可读"); // 输出:可读 console.log(userPermissions & EXECUTE ? "可执行" : "不可执行"); // 输出:不可执行数据压缩
使用二进制位存储多个布尔值或小范围整数,减少内存占用。
示例:
typescriptlet packedData = 0; packedData |= (1 << 0); // 设置第 1 个布尔值 packedData |= (0 << 1); // 设置第 2 个布尔值 console.log(packedData & (1 << 0) ? "第 1 个布尔值为 true" : "第 1 个布尔值为 false"); // 输出:第 1 个布尔值为 true