java中相关的位操作
运算 | 功能 | 说明 |
---|---|---|
& | 按位与 | a&b a b对应位与 |
| | 按位或 | a|b a b对应位或 |
~ | 位非 | ~a a按位取反 |
>> | 位右移 | a>>b a的二进制位向右移动b位,高位补零 |
<< | 位左移 | a<<b a的二进制位向左移动b位,低位补零 |
>>> | 无符号位右移 | 负数的时候,符号位不参与移位, |
^ | 位异或 | a^b a与b按位异或 |
二进制位反转思路
以下二进制位用8位做演示
a = 0000 0110 ; 十进制: 6
反转二进制位后
a = 0000 0011 ; 十进制: 3
只保留一个数的最低位,其余位变为0:
n = 0000 1101;
n & 1 = 0000 0001;
假设a = 0000 0110,b=0(用来保存结果) </br>
a每次右移一位,然后最低位与b的最低位 进行位或,然后b左移一位, 直到a == 0为止,这样 b中则是a的反转二进制位的。
过程演示
a = 0000 0110
b = 0000 0000a = 0000 0011</br>
b = 0000 0001a = 0000 0001</br>
b = 0000 0011a = 0000 0000 停止,此时b就是a反转后的结果
java实现代码
public int reverseNum(int n){
int r = 0 ;//反转的结果
while(n!=0){ // 直到a==0,不然一直进行移位
//或运算将n的最低位保存到r中,同时r左移一位,
//保证上次的移位结果向左移动,新的需要保存的移位结果一直在r的最低位中
r = (r<<1) | (n & 1);
n = n>>1; // n右移一位
}
return r;
}
java 实例
public class EvenNumReverse {
public void reverse(){
Scanner in = new Scanner(System.in);
int count = 0;//输入的数的个数
int[] seq;//保存输入结果
//需要输入的数的个数不为零情况下,一直输入
while((count = in.nextInt())!=0){
seq = new int[count];
for(int i=0;i<count;i++){
int n = in.nextInt();
if(n%2==0)
n = reverseNum(n);
seq[i] = n;
}
print(seq);
}
in.close();
}
//将一个数的二进制位反转
public int reverseNum(int n){
int r = 0 ;
while(n!=0){
r = (r<<1) | (n & 1);
n = n>>1;
}
return r;
}
/*
* 打印数组
*/
public void print(int[] res){
if(res!=null)
for(int i=0;i<res.length;i++){
System.out.print(res[i]+"\t");
}
}
public static void main(String[] args){
EvenNumReverse o = new EvenNumReverse();
o.reverse();
}
}
-
输入输出结果
3</br>
1 6 5</br>
1 3 5 </br></br>
3</br>
2 4 6</br>
1 1 3</br>