位运算练习

编号 运算符 名称 示例 说明
1 & x&y
2 | x|y
3 ~ 取反 ~x
4 ^ 异或 x^y
5 >> 右移 x>>y
6 << 左移 x<<y
7 >>> 无符号右移 x>>>y 左边填0
import java.util.Scanner;

/**
 * Description:
 * <p>
 * 位运算练习
 * @date 2019/03/25 下午10:39:48
 * @author shuvidora
 */

public class BitTest {
    /**
     * 第i位替换
     * @param n
     * @param m
     * @param i
     * @return 返回一个整数,该整数的第i位和m的第i位相同,其他位和n相同
     */
    static int bitManiputation1(int n, int m, int i) {
        return (n & (~(1 << i)) | ((m >> i) & 1) << i);
    }

    /**
     * 第i位取反,0^1=1,0^0=0;1^1=0,1^0=1. 构造一个整数,该整数的第i位是1,其余位都是0,然后与n进行异或运算
     * @param n
     * @param i
     * @return 返回值为一个整数,该整数的第i位是n的第i位取反,其余位和n相同
     */
    static int bitManiputation2(int n, int i) {
        return (1 << i) ^ n;
    }

    /**
     * 左边i位取反 0|x=0^x,x^x=0(x=0,1) 整型数值长32位,目标整数由两部分拼接而成: 左边i位是n的左边i位取反,考虑用1异或
     * 右边32-i位和n相同,不作变化,考虑用0异或 因此构造一个整数,该整数左边i位全为1,右边剩余的(32-i)位都为0
     * @param n
     * @param i
     * @return 返回一个整数,该整数的左边i位是n的左边i位取反,其余位和n相同
     */
    static int bitManiputation3(int n, int i) {
        return (~0x0 << (32 - i)) ^ n;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        switch (args[0]) {
            case "1":
                int t1, n1, m1, i1;
                t1 = scanner.nextInt();
                while (t1-- > 0) {
                    n1 = scanner.nextInt();
                    m1 = scanner.nextInt();
                    i1 = scanner.nextInt();
                    System.out.println(bitManiputation1(n1, m1, i1));
                }
                break;
            case "2":
                int t2, n2, i2;
                t2 = scanner.nextInt();
                while (t2-- > 0) {
                    n2 = scanner.nextInt();
                    i2 = scanner.nextInt();
                    System.out.println(bitManiputation2(n2,i2));
                }
                break;
            case "3":
                int t3, n3, i3;
                t3 = scanner.nextInt();
                while (t3-- > 0) {
                    n3 = scanner.nextInt();
                    i3 = scanner.nextInt();
                    System.out.println(bitManiputation3(n3, i3));
                }
                break;
            default:
                System.out.println("No such case!");
                break;
        }
        scanner.close();
    }

}

位运算作业: http://cxsjsx.openjudge.cn/hw201901/statistics/

猜你喜欢

转载自www.cnblogs.com/xsjzhao/p/11203151.html