位运算操作 备忘
,
x % y
, 若 ,可以使用位运算代替,- 即
- 取余数,是取低位,以 为例, ,
- 会发现,和 取余,恰好是低位的值,也即余数
x & (x - 1)
去除x
中最后一个1
可以用来求一个数的二进制表示形式的
1
的个数x & (-x)
可以获得x
的最低的非0位(即最低有效位,LowBit)-x
的值,相当于在x
的基础上按位取反~x
后再增加1所得- 注意和负数补码的计算区别开,这里按位取反,符号位也要取反!
- 参考本博客文章关于反码和补码
n
的二进制表示中,第k
位是几?——n>>k&1
先把第k位移动到最后一位:
n>>k
然后看最后一位是几:
n&1
综合第1和第2步,即为:
n>>k&1
位运算补充
&
(AND)常用作二进制取特定位上的值,
例如:
x&1
取最后一位二进制数,可用来判断是偶数还是奇数例如:我想取二进制第6位上的值,
(x >> 5) & 1
|
常用作二进制特定位上的无条件赋值,例如:x | 1
的结果就是将x的最后一个二进制位赋为1,
例如:若将二进制最末位变成0,
(x|1) - 1
即可
某一位置1–>x |= (1 << y)
某一位置0–>x &= ~(1 << y)
- 异或
^
假定下面的x是二进制的一位,也就是0或者1!
1
2
3
4
50 ^ x = x
x ^ x = 0
x ^ 1 = ~x关于「原码、补码、反码」参见三码和~-
左移
<<
、右移>>
等参见 java中的左移、右移、无符号右移
关于各种进制
进制 | 二进制 | 八进制 | 十进制 | 十六进制 |
---|---|---|---|---|
英语名称 | Binary | Octal | Decimal | Hexadecimal |
前缀表示 | 0b,0b1100 | 0,014 | 无,12 | 0x,0xc |
后缀表示 | B,1100B | O(字母O),14O | D,12D | H,cH |
12 | 12 | 12 | 12 |
关于哈希表
不要滥用。
要明白,哈希表最大的特点是可以O(1)的时间复杂度进行查询。
如果实际场景的需求是:为关键词保存一个value,即仅需要key-value的数据结构时,可以灵活一点,使用数组来解决。
前提是key的数据结构不能太复杂,char、int、都可以。若是TreeNode这样的还是得用哈希表。
二分查找
int mid = (r - l) / 2 + l;
这种写法,可以避免数值溢出。
Java I/O
关于字节流和字符流
使用 BufferedReader
来获取键盘输入
使用 BufferedWriter
来打印输出
例子,输入如下,将其获取,并存到数组中去。
1 | 6 |
代码:
1 | public class Main { |
注意:
- 需要声明IO异常
static
的使用- 类型转换,将字符串进行转换