文章目录
1.基础知识
与 &
或 |
非 !
异或 ^ (不进位加法)
A ^ 0 = 本身
A ^ 1 = 取反
A ^ A = 0
A ^ B ^ B =A
int类型 是32位的二进制数 (带符号)
1.判断奇偶
2.获取二进制位是0还是1
3.交换两个整数变量的制
4.求整数的绝对值
正数绝对值=本身
负数绝对值=本身取反 + 1 (带符号数)
->正数绝对值=本身 + 0
本身 :每一位异或 0
取反 :每一位异或 1
刚好是带符号数的符号位
加 0
加1
刚好也是带符号数的符号位
第一步:本身or取反?
对A做算术右移31位( A>>31),空位补符号位
刚好是全0 or 全1
A & 算数右移的结果
第二步:加0or加1
对A做逻辑右移31位( A>>>31),空位补0
刚好是0 or 1
A & 算数右移的结果 + A>>>31
5.找出唯一成对的数
不用辅助空间
用异或消除掉不重复的
A ^ A = 0
异或满足交换律
A ^ B ^ C = C ^ B ^ A
数组A包含1~1000,(有1个重复)
用A异或1~1000,会将所有1~1000消掉,剩下一个没被消除的,就是重复的
构造数组:
定一个随机数(放在数组最后),
定一个随机下标
将这个下标的数和数组最后的随机数交换位置
用辅助空间
6.判断一个数的二进制形式中2的个数
7.用一条语句判断一个整数是否是2的整数次方
8.将整数的奇偶位互换
9.求0~1之间小数的二进制表示
10.数组中有一个数只出现了一次,其他数出现了k次,输出这个数
思路:消去出现出现k次的数
对k进制的数,做k次不进位加法, 结果=0
*把所有数转成k进制,并对他们做不进位加法
用二维数组的每一行来存一个数,
每一列来存 数的每一位
难点:相加的时候要保证每一位对齐
以3进制为例
2 : 002 ,但是输出的是2,存的时候是 [ 2 ] [ ] [ ]
5 : 012 , 输出的是12 存的时候是 [ 1 ] [ 2] [ ]
9 : 100 , 100 存的时候是 [ 1 ] [ 0] [0 ]
最低位的2不能与最高位的1相加
位权 不一样
怎么保证低位对低位~~,高位对高位~~ ?
1.确定列数,由所有三进制中最多位数的决定多少位
2.将数的高位低位,顺序颠倒一下
低位在前,低位在前即可,可以达到按低位对齐的效果
颠倒顺序: StringBuilder类的 reverser()方法可以将数组顺序颠倒
int 转成 三进制String 再转成 StringBuilder类 再通过转成String类 最终转成char类
char[][] array;
for( 行数 ){
new StringBuilder(Integer.toString(每一行,3)).reveser().toString.toCharArray();
}
相加: 按每一列相加
for循环,循环次数由所有三进制中最多位数的决定
判断二维数组中,每一行的长度 (列数),
长度 < 最多位数:高位没有的时候,相加时候+0
将char 转成数字 int,
当前字符 比如’9’
和0字符 ‘0’ 的差距就是真实的值
‘9’ - ‘0’ =9
不进位加法的结果 = 取余
用所有的结果 对k 取余
再乘以位权, 得到结果
Math.pow(x,y)返回值 x的 y 次幂