370 字
2 分钟
【算法笔记】(一)二进制和位运算
1、负数的二进制
- 十进制负数转换为二进制: 负数的正数二进制表示 -> 减一 -> 取反
- 二进制的负数转换为十进制: 取反 -> 加一 -> 正数二进制表示
注意:最小负数的二进制表示是它本身
2、位运算
| 运算符 | 名称 | 作用对象 | 运算效果 | 示例 | 结果 |
|---|---|---|---|---|---|
& | 按位与 | 整数 | 两位都为 1 才为 1 | 6 & 3 | 2(110 & 011 = 010) |
| | 按位或 | 整数 | 有一位为 1 就为 1 | 6 | 3 | 7(110 |
^ | 按位异或 | 整数 | 两位不同为 1,相同为 0 | 6 ^ 3 | 5(110 ^ 011 = 101) |
~ | 按位取反 | 整数 | 0→1,1→0(补码) | ~6 | -7 |
<< | 左移 | 整数 | 左移 n 位,右侧补 0(≈×2ⁿ 只对非负数有效) | 3 << 2 | 12 |
>> | 算术右移 | 整数 | 右移 n 位,左侧补符号位(≈÷2ⁿ 只对非负数有效 向下取整) | -8 >> 1 | -4 |
>>> | 逻辑右移 | 整数 | 右移 n 位,左侧补 0(无符号右移) | -8 >>> 1 | 2147483644(int) |
- 一个整数的相反数 = 取反 + 1(但是负数的最小值不适用)
3、如何打印二进制?
public static void printBinary (int n) { for (int i = 31 ;i >= 0 ; i --) { System.out.print((n & (1 << i)) == 0 ? "0" : "1"); } System.out.println();}注意:
1、由于运算符优先级的问题,n & (1 << i) == 0 会被解析为 n & ((1 << i) == 0),因此我们需要括号来规定优先级
2、代码所展示的是int类型,对于long类型,需要写成n & (1L << i)
部分信息可能已经过时









