题目描述
给定一个int型整数x,将x的二进制表示中第i位和第j位的值互换。0≤i,j≤31。
注意: x的二进制表示的最右边为第0位。
输入格式:
在一行中输入三个整数,x,i,j, 整数之间用一个空格分隔。
输出格式:
在一行中输出互换后的结果
样例1
input
38 2 4
ouput
50
样例2
input
1 0 2
ouput
4
题目来源
华东师范大学保研机试-2022-位运算,OJ地址:塔子哥codefun2000
位运算思路
第一步:获取第i位的值
int ix = (x >> i) & 1; // 获取x值的第i位的值
int jx = (x >> j) & 1; // 获取x值的第j位的值
第二步:如果两个位置的不同,则进行交换
if(ix != jx){
x = (1 << i)^x; // 对第i位取反
x = (1 << j)^x; // 对第j位取反
}
位运算知识
<<
左位移运算符:左操作数按位左移右操作数指定的位数。(符号位不变,低位补0。移几位补几个0)
System.out.println(Integer.toBinaryString(9)); // 1001
System.out.println(Integer.toBinaryString(9 << 2)); // 100100
System.out.println(9 << 2); // 36
>>
右位移运算符:左操作数按位右移右操作数指定的位数。(如果值为正,则高位补0,如果值为负,则高位补1)
正数:
System.out.println(Integer.toBinaryString(5)); // 101
System.out.println(Integer.toBinaryString(5 >> 2)); // 001 即 1
System.out.println(5 >> 2); // 1
负数:
System.out.println(Integer.toBinaryString(-5)); // 11111111111111111111111111111011
System.out.println(Integer.toBinaryString(-5 >> 2)); // 11111111111111111111111111111110
System.out.println(-5 >> 2); // -2
^
按位异或:如果相对应位值相同,则结果为0,否则为1。(相同为0不同为1)
System.out.println(Integer.toBinaryString(5)); // 101
System.out.println(Integer.toBinaryString(2)); // 10
System.out.println(Integer.toBinaryString(5 ^ 2)); // 111
System.out.println(5 ^ 2); // 7
System.out.println(Integer.toBinaryString(7)); // 111
System.out.println(Integer.toBinaryString(6)); // 110
System.out.println(Integer.toBinaryString(7 ^ 6)); // 1
System.out.println(7 ^ 6); // 1
&
按位与:如果相对应位都是1,则结果为1,否则为0。(都是1才为1)
System.out.println(Integer.toBinaryString(6)); // 110
System.out.println(Integer.toBinaryString(4)); // 100
System.out.println(Integer.toBinaryString(6 & 4)); // 100
System.out.println(6 & 4); // 4
&
按位或:如果相对应位都是 0,则结果为 0,否则为 1。(都是0才为0)
System.out.println(Integer.toBinaryString(6)); // 110
System.out.println(Integer.toBinaryString(4)); // 100
System.out.println(Integer.toBinaryString(6 | 4)); // 110
System.out.println(6 | 4);// 6
最终代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
int i = scanner.nextInt();
int j = scanner.nextInt();
int ix = (x >> i) & 1; // 获取x值的第i位的值
int jx = (x >> j) & 1; // 获取x值的第j位的值
if(ix != jx){
x = (1 << i)^x; // 对第i位取反
x = (1 << j)^x; // 对第j位取反
}
System.out.println(x);
}
}