位运算练习
编号 | 运算符 | 名称 | 示例 | 说明 |
---|---|---|---|---|
1 | & | 与 | x&y | |
2 | | | 或 | x|y | |
3 | ~ | 取反 | ~x | |
4 | ^ | 异或 | x^y | 不进位加法 |
5 | >> | 右移 | x>>y | |
6 | << | 左移 | x<<y | |
7 | >>> | 无符号右移 | x>>>y | 左边填0 |
/**
- Description:
-
- 位运算练习
- @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/>
posted on 2019-07-17 19:26 jinzhaoshi 阅读(337) 评论(1) 编辑 收藏 举报