(1)<<
将一个数的二进制向左移动n位
格式:num << n
//0000 0011
int num = 3;
//0000 1100 左移补0
num = num<<2;
System.out.println(num);
结果为:
12
(2)>>
将一个数的二进制向右移动n位
格式:num >>n
//0000 0101
int num = 5;
//0000 0001 左移补最高位,因为这里我们讨论正数,所以总是补0
num = num>>2;
System.out.println(num);
结果为:
1
(3)&、|、 ^、~
&:即与,二进制各个位,全为1结果才为1
| : 即或,二进制各个位,有一个为1结果就为1
^:即异或,二进制各个位,相同为0不同为1(常用来判断两个数是否相同)
|~: 即非,二进制各个位,按位取反
(4)常用操作
1.设置num的第n位为1:num | (1<<n)
解释:1的二进制为0000 0001 ,那么1<<n表示1的各位左移n位,如n=3,则结果为0000 1000,再与num取或就可以将num的第n位设为1
2.设置num的第n位为0:num & ~(1<<n)
解释:1的二进制为0000 0001 ,那么如果n=3,那么1<<n = 0000 1000 取反得1111 0111 ,再与num相与就可以设置第n位为0
3.获得num的第n位为0还是1:(num>>n) & 1
解释:如果num=0000 0101,求它的第2位是什么(从第0位开始),那么num>>2表示将num右移2位,得到0000 0001,1的二进制为0000 0001,及结果为 0000 0001(如果求第1位是什么,num>>1,结果为0000 0010,与1相与得0000 0000 ,即0)
(5)自己实现BitSet位图
class MyBitSet
{
private long[] mBits; //位图
//传入参数size表示需要生成的位图的大小
public MyBit(int size)
{
//((size-1)>>6)因为long为64bit,所以每次申请都是64的倍数,这是要计算需要多少个long
//其实更好理解的方式为:size/64+1
mBits = new long[((size-1)>>6)+1];
}
public void set(int index)
{
//pos代表在第几个pos中
int pos = index/64;
//offset代表第多少位
int offset = index%64;
//设置指定位为1
mBits[pos] = mBits[pos] | (1l<<offset);
}
public long get(int index)
{
int pos = index/64;
int offset = index%64;
long temp = mBits[pos];
return temp>>offset&1;
}
}
当然可以不用long型,如确定字符串中字符是否出现时,由于字符只有26个,所以只需要26位就可以了,所以一个int类型8*4=32bit就足够了
(6)java中的BitSet
BitSet set = new BitSet(1000);
;
set.set(12, true);
System.out.println(set.get(12));
结果为:
true