与运算:与0是消除,与1是保留
M | 奇y | 偶x | 奇y | 偶x | 奇y | 偶x | 奇y | 偶x |
a | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
b | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
c:M&a | 0 | x | 0 | x | 0 | x | 0 | x |
d:M&b | y | 0 | y | 0 | y | 0 | y | 0 |
c^d | M:yxyxyxyx | |||||||
(c左1)^(d右1) | 置换后的:xyxyxyxy |
举例来说
M | 1 | 0 | 0 | 1 |
a | 0 | 1 | 0 | 1 |
b | 1 | 0 | 1 | 0 |
c | 0 | 0 | 0 | 1 |
d | 1 | 0 | 0 | 0 |
c左1 | 0 | 0 | 1 | 0 |
d右1 | 0 | 1 | 0 | 0 |
(c左1)^(d右1) | 0 | 1 | 1 | 0 |
知识点:
0xaaaaaaaa = 10101010101010101010101010101010 (偶数位为1,奇数位为0)
0x55555555 = 1010101010101010101010101010101 (偶数位为0,奇数位为1
import java.util.Scanner;
public class a{
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int b=in.nextInt();
System.out.println(m(b));
}
public static int m(int i) {
int ou=i&0xaaaaaaaa;//和1010 1010 1010.....做与运算取出偶数位
int ji=i&0x55555555;//和0101 0101 0101.....做与运算取出奇数位
return (ou>>1)^(ji<<1);//连起来
}
}