关于位运算的问题,大侠请进
问题是:
mBits[index] = mBits[index] | (1<<(pos%32)); 如何把位该为1.
比如pos等于100时,
mBits[3] = mBits[3] | (1<<4);//这个是如何进行位运算呢?请大侠们指点下。
我的理解是:
mBits[3]是32位,也就是说32个为0的Bit如何和1<<4或运算,想不通如何将第100位变为1?变为1不是123位吗?
代码如下:
public class BitSet {
private int[] mBits;
private int mSize;
/**
* 初始化指定个bit
* @param size 初始化的bit数目
*/
public BitSet(int size) {
mSize = size;
initBits();
}
/**
* 初始化整型数组
*/
private void initBits() {
//Java中整型为32位,所以数组长度为位长度/32。
int count = (int) Math.ceil(mSize/32f);
mBits = new int[count];
clear();
}
/**
* 将指定bit位置设为1
* @param pos
*/
public void set(int pos) {
//得到此pos在数组中的索引
int index = (int)Math.floor(pos/32f);
//把当前整数的第n位设置为1
mBits[index] = mBits[index] | (1<<(pos%32));
}
/**
* 获取指定位是否存在
* @param pos
* @return
*/
public boolean get(int pos) {
int index = (int)Math.floor(pos/32f);
return mBits[index] == (mBits[index] | 1<<(pos%32));
}
/**
* 指定bit位置设为0
* @param pos
*/
public void reset(int pos) {
int index = (int)Math.floor(pos/32f);
//把当前整数的第n位设置为0
mBits[index] = mBits[index] & ~(1<<(pos%32));
}
/**
* 清空,全部置零
*/
private void clear() {
int len = mBits.length;
for(int index=0; index<len; index++) {
mBits[index] = 0;
}
}
}
============================================================
------解决方案--------------------
128位太长,我简化一下吧,比如说32位,每个变量保存8位,
如果原来的数是10101010,01010101,11111111,00000000
那么你的第一步是把这个数分解成一个数组,每个变量保存8位,数组长度为4,数组中的元素对应于逗号区隔的4个部分。
如果要把第30位设置为1,先找到保存第25位到32为的变量。现在找到的就是10101010(也可能是00000000,从哪头数你自己去确认)。然后30%8得到的是6,1<<6得到的是1000000,与10101010进行或运算,或运算就是对位运算,第一位对第一位比较,结果仍放在第一位。或运算是只要有一个是1,结果就是1。
1000000的第7位是1,那么结果的第7位也肯定是1.其他位都是0,那么结果就是另一个数的对应位的值。这样就达到了把原来的数据的某一位设为1的作用(具体从0数还是从1数没考虑)。
实际上或超作如果其中一个超作数只有一位是1,那么结果就是把另一个数的对应位设为1。
最近研究c++,用位运算比较多。实际应用可以用一个int变量,32位的话,就代表32个bool变量。设为某一位为1,就与“1左移多少位”进行或操作;判断某一位是否为1,就与“1左移多少位”进行与超作,结果非0,就证明那一位为1.