【位运算】CodeFun P1049 华东师大保研机试位运算

题目描述

给定一个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);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值