Java的位运算符 与(&)、非(~)、或(|)、异或(^) 的某些妙用。

来源:互联网 发布:打底单的软件 编辑:程序博客网 时间:2024/06/05 20:58

 

 

有时候,我们需要判断几个值是否全部大于0,或者全部小于0,对于刚学编程不久,或许我们会选择逐一判断。

例如:

 

 

public boolean checkPositiveInteger(int a,int b,int c){

 

return (a>0&&b>0&&c>0);

}

 

 

咋一看这个程序好像没什么问题,运行起来也很正常,但是,作为程序员的我们必须尽可能地追求完美。

 

 

大家都应该知道|是什么意思,从二进制的角度上说,只要在这几个数同样的位上有一个是1,结果就是1。

负数的符号位用1来表示,因此如果一个数是负数那么任何数与这个数进行或(|)运算,都是负数。因此,这个程序可以修改为:

 

 

 

public boolean checkPositiveInteger(int a,int b,int c){

 

return (a|b|c)>0;

}

 

如此一来,程序优雅而高效。

 

同理。大家可以尝试其它运算符得到更多的结论。


 

我在这里抛砖引玉,给出一些简单的结论:

-1|任何数都得-1(因为-1的补码全部是1)

负数&任何正数都为正数

负数|任何正数都得负数

再附上一个例子,设置闹钟,

//& | ~ ^
public class Clock {
public static void main(String[] args) {
Clock b = new Clock();
b.setClock(5);
b.setClock(4);
b.setClock(3);
b.printClock();
b.cancleClock(5);
b.printClock();
b.cancleClock(3);
b.printClock();
}


int dayClock = 0;


/**
* 给某一天设置闹钟

* @param day
*/
public void setClock(int day) {
dayClock |= 1 << day;
}


/**
* 判断某一天是否设置闹钟

* @param day
* @return
*/
public boolean isClock(int day) {
int bit = 1 << day;
return (dayClock & bit) == bit;
}


/**
* 取消闹钟

* @param day
*/
public void cancleClock(int day) {
if (isClock(day))
dayClock ^= 1 << day;
}


/**
* 打印
*/
public void printClock() {
StringBuilder bif = new StringBuilder();
for (int i = 0; i < 7; i++) {
if (isClock(i)) {
bif.append(i).append(",");
}
}
System.out.println("闹钟设置为:" + bif);
}
}

原创粉丝点击