- 用位运算符求一个整数(int)的绝对值(要求有代码和截图哈)
package com.cskaoyan.homework;
/**
* 用位运算符求一个整数(int)的绝对值
* a = -6 -> 10000000 00000000 00000000 00000110
* 11111111 11111111 11111111 11111001
* 11111111 11111111 11111111 11111010
* a >> 31 -> 11111111 11111111 11111111 11111111 有符号右移31位,则32位的值都为原符号位的值
* a + (a >> 31) 11111111 11111111 11111111 11111001
* (a + (a >> 31)) ^ (a >> 31)
* 00000000 00000000 00000000 00000110
*
*/
public class work01 {
public static void main(String[] args){
int a = -6;
int result = (a + (a >> 31)) ^ (a >> 31) ;
System.out.println(a + "的绝对值为:" + result);
}
}
- 有三个int变量,a, b, c假设三个变量中有两个变量的值相同,请问如何快速求出,那个和其他两个变量不同的第三个变量的值?(代码+截图)
package com.cskaoyan.homework;
/**
* 有三个int变量,a, b, c假设三个变量中有两个变量的值相同,请问如何快速求出,那个和其他两个变量不同的第三个变量的值?
*/
public class work02 {
public static void main(String[] args){
int a = 2;
int b = 3;
int c = 2;
//因为两数相等,所以只有三种情况:a=b或者a=c或者b=c
//所以可以采用三目运算符嵌套的方法来做
int result = (a == b) ? c : (a == c ? b : a);
System.out.println(a + "," + b + "," + c + "这3个数中,与其他两个数不相等的数为:" + result);
}
}
- 任给一个i在这里插入代码片nt类型的正整数,如何判断该整数的值,是否是2的整数次幂?(代码+截图)
package com.cskaoyan.homework;
/**
*任给一个int类型的正整数,如何判断该整数的值,是否是2的整数次幂?
* a = 16 -> 00000000 00000000 00000000 00010000
* b = a - 1 -> 00000000 00000000 00000000 00001111
* i = a & b -> 00000000 00000000 00000000 00000000
*
* a = 15 -> 00000000 00000000 00000000 00001111
* b = a - 1 -> 00000000 00000000 00000000 00001110
* i = a & b -> 00000000 00000000 00000000 00001110
*/
public class work03 {
public static void main(String[] args){
int a = 15;
int b = a - 1;
int i = a & b ;
if(i == 0)
System.out.println(a + "是2的整数次幂");
else
System.out.println(a + "不是2的整数次幂");
}
}
附加题
1.一个十进制整数(int),的二进制表示形式(补码)中,包含的1个数? 比如0x80000000 中只包含一个1 (代码加截图)
package com.cskaoyan.homework;
/**
* 一个十进制整数(int),的二进制表示形式(补码)中,包含的1个数? 比如0x80000000 中只包含一个1
* n = 0x80000000 -> 10000000 00000000 00000000 00000000 i = 1
* n - 1 -> 01111111 11111111 11111111 11111111
* n = n & (n - 1) -> 00000000 00000000 00000000 00000000 退出
*
* n = 0x00000007 -> 00000000 00000000 00000000 00000111 i = 1
* n - 1 -> 00000000 00000000 00000000 00000110
* n = n & (n - 1) -> 00000000 00000000 00000000 00000110 i = 2
* n - 1 -> 00000000 00000000 00000000 00000011
* n = n & (n - 1) -> 00000000 00000000 00000000 00000010 i = 3
* n - 1 -> 00000000 00000000 00000000 00000001
* n = n & (n - 1) -> 00000000 00000000 00000000 00000000 退出
*/
public class add01 {
public static void main(String[] args){
int n = 7;
int i = 0;
while(n != 0) {
i++;
n = n & (n - 1);
}
System.out.println("该整数的二进制形式中含有" + i + "个1。");
}
}
附加题
2.有两个整数m,n,计算需要改变m的二进制表示(补码)中的多少位,才能得到n?(代码 + 截图) 比如10的二进制补码为1010,13的二进制补码表示为1101,那么至少需要改变1010中的3位才能得到1101
package com.cskaoyan.homework;
/**
* 有两个整数m,n,计算需要改变m的二进制表示(补码)中的多少位,才能得到n?
* m = 10 -> 00000000 00000000 00000000 00001010
* n = 13 -> 00000000 00000000 00000000 00001101
* temp = m ^ n -> 00000000 00000000 00000000 00000111
* 再由add01中的方法计算可知m和n有3位不同
*/
public class add02 {
public static void main(String[] args){
int m = 10;
int n = 13;
int temp = m ^ n;//先将两个数异或
int i=0;
//注意这里和add01的关系
while(temp != 0){
i++;
temp = ( temp &( temp - 1));//求异或后1的个数
}
System.out.println("需要改变m的二进制表示(补码)中的" + i + "位。");
}
}