一、“与”运算的性质

按位“&”的性质:

  • 两个数的二进制位都为 1 时,结果位为 1
  • 两个数的二进制位中只要有一个为 0 时,结果位为 0

二、练习示例

使用按位与运算,实现一个方法,打印一个整数的32位二进制数

1
2
3
4
5
6
7
8
9
10
public static void print(int num){
for (int i = 31; i >=0 ; i--) {
System.out.print((num&(1<<i))==0?"0":"1");
}
System.out.println();
}
public static void main(String[] args) {
int num = 3;
print(num);
}

1、代码解释

使用for 循环,从 i = 31 开始递减至 i = 0。这里的 i 代表了整数 num 的二进制表示中的位索引(从左到右),即最高位开始(第 31 位)到最低位结束(第 0 位)。

在循环内部,使用1 << i 操作来生成一个掩码,该掩码仅在第 i 位为 1,其他位均为 0。接着,用按位与操作 & 对整数 num 和掩码进行位操作:num & (1 << i)。如果 num & (1 << i) 的结果等于 0,则说明 num 的第 i 位是 0;否则,第 i 位是 1。

2、为什么要用1<<n来判断二进制数

因为,当我们需要检查某个整数的二进制表示中第 n 位(从右至左,从 0 开始计数)是否为 1 时,可以使用这种方法。使用位左移操作可以轻松地生成一个掩码,即二进制数值中仅在第 n 位为 1 的数,其他位均为 0。

掩码是一串用于与目标数据进行按位操作的二进制数字1。简单来说,掩码就是一串二进制码2。掩码中的每一位都与目标数据中的每一位进行比较,以确定目标数据中的哪些位将被保留,哪些位将被丢弃1。

使用 1 << n 的方法可以轻松地生成掩码,方便我们判断、设置或清除整数的特定位。

什么是掩码?

位掩码

3、为什么有符号整型最大值小于无符号整型的最大值

因为,有符号整型和无符号整型的核心区别在于如何表示和解释整数的正负。在有符号整型中,首位(最高位,也称为符号位)用于表示整数的正负,而在无符号整型中,所有位都用于表示整数的实际数值。所以,有符号整型的最大值约为无符号整型的最大值是一半。

  • 有符号整型:由于符号位用于表示整数的正负,剩下的 n - 1 位用于表示整数的数值。因此,最大的有符号整数为 2^(n-1) - 1。

所以,在 32 位有符号整型中,最大值为 2^31 - 1 = 2,147,483,647。

  • 无符号整型:无符号整型中,所有 n 位都用于表示整数的数值,因此最大的无符号整数为 2^n - 1。

例如,在 32 位无符号整型中,最大值为 2^32 - 1 = 4,294,967,295。