日期:2014-05-20  浏览次数:20738 次

关于位运算的问题,大侠请进
问题是:
 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.