将 int 左移时会发生什么
What happens when you shift an int left
我正在尝试理解为创建 my_hashset 而创建的这段代码的一部分:https://leetcode.com/problems/design-hashset/discuss/548792/Java-solution-faster-than-99
class HashCode_from_leet {
int[] bitArr;
private static final int MAX = 100000;
private static final int INT_SIZE = Integer.SIZE;
public HashCode_from_leet() {
bitArr = new int[MAX / INT_SIZE + 1];
}
public void add(int key) { //pass in 5
int ind = key / INT_SIZE;
int bit = key % INT_SIZE;
int bitMask = 1 << bit; //QUESTION: why does bitMask = 32?
bitArr[ind] |= bitMask; // QUESTION: what does '|=' mean?
}
// NOTE I REMOVED SOME METHODS
public boolean contains(int key) {
int ind = key / INT_SIZE;
int bit = key % INT_SIZE;
int bitMask = 1 << bit;
return (bitArr[ind] & bitMask) != 0;
}
public static void main(String[] args) {
HashCode_from_leet hfl = new HashCode_from_leet();
hfl.add(5);
System.out.println(hfl.contains(5));
}
}
当我将 5 传入 add(int key)
方法时
bitMask = 32
我不确定为什么 -- 我理解 <<
表示向左移动,所以我们取 5 并将其向左移动,但会认为等于 5*10^2 吗?
当你 shift left
X 的整数时,例如:Z =(Y << X)
它会实际执行此操作
: Z = (Y * (2^X))
当你 shift right
X 的整数时,例如:Z =(Y >> X)
它会实际执行此操作
: Z = (Y / (2^X))
what happens when you shift an int left
顾名思义,将数字左移 n
位,乘以 2^n
。下面的代码将帮助您更好地理解它。
public class Main {
public static void main(String[] args) {
int x = 5;
System.out.println("In decimal: " + x + ", In Binary: "
+ "0000000000000000".substring(Integer.toBinaryString(x).length()) + Integer.toBinaryString(x));
int y = x << 1;
System.out.println("In decimal: " + y + ", In Binary: "
+ "0000000000000000".substring(Integer.toBinaryString(y).length()) + Integer.toBinaryString(y));
int z = x << 2;
System.out.println("In decimal: " + z + ", In Binary: "
+ "0000000000000000".substring(Integer.toBinaryString(z).length()) + Integer.toBinaryString(z));
}
}
输出:
In decimal: 5, In Binary: 0000000000000101
In decimal: 10, In Binary: 0000000000001010
In decimal: 20, In Binary: 0000000000010100
通知行int bit = key % INT_SIZE; // which is 5 % 32 according to your code
所以现在bit = 5 // because 5 % 32 = 5
现在int bitMask = 1 << bit; // you're saying shit 1 to five bits to left
in 32 bits 1 = 000000000000000000000000000000000001
左移5位后变为:
000000000000000000000000000000000100000 = 32 //in binary that is why bitmask continas 32
现在我们来谈谈|=
运算符
|
是一个按位或运算符,您只是将其用作复合赋值
bitArr[ind] |= bitMask is similar to bitArr[ind] = bitArr[ind] | bitmask
例如说bitArr[ind] equals 5 and bitmask equals 3
现在bitArr[ind] | bitmask
意味着5 | 3
它将与二进制表示进行按位或运算
表示 101 | 011
变成 111
即 7
我正在尝试理解为创建 my_hashset 而创建的这段代码的一部分:https://leetcode.com/problems/design-hashset/discuss/548792/Java-solution-faster-than-99
class HashCode_from_leet {
int[] bitArr;
private static final int MAX = 100000;
private static final int INT_SIZE = Integer.SIZE;
public HashCode_from_leet() {
bitArr = new int[MAX / INT_SIZE + 1];
}
public void add(int key) { //pass in 5
int ind = key / INT_SIZE;
int bit = key % INT_SIZE;
int bitMask = 1 << bit; //QUESTION: why does bitMask = 32?
bitArr[ind] |= bitMask; // QUESTION: what does '|=' mean?
}
// NOTE I REMOVED SOME METHODS
public boolean contains(int key) {
int ind = key / INT_SIZE;
int bit = key % INT_SIZE;
int bitMask = 1 << bit;
return (bitArr[ind] & bitMask) != 0;
}
public static void main(String[] args) {
HashCode_from_leet hfl = new HashCode_from_leet();
hfl.add(5);
System.out.println(hfl.contains(5));
}
}
当我将 5 传入 add(int key)
方法时
bitMask = 32
我不确定为什么 -- 我理解 <<
表示向左移动,所以我们取 5 并将其向左移动,但会认为等于 5*10^2 吗?
当你 shift left
X 的整数时,例如:Z =(Y << X)
它会实际执行此操作
: Z = (Y * (2^X))
当你 shift right
X 的整数时,例如:Z =(Y >> X)
它会实际执行此操作
: Z = (Y / (2^X))
what happens when you shift an int left
顾名思义,将数字左移 n
位,乘以 2^n
。下面的代码将帮助您更好地理解它。
public class Main {
public static void main(String[] args) {
int x = 5;
System.out.println("In decimal: " + x + ", In Binary: "
+ "0000000000000000".substring(Integer.toBinaryString(x).length()) + Integer.toBinaryString(x));
int y = x << 1;
System.out.println("In decimal: " + y + ", In Binary: "
+ "0000000000000000".substring(Integer.toBinaryString(y).length()) + Integer.toBinaryString(y));
int z = x << 2;
System.out.println("In decimal: " + z + ", In Binary: "
+ "0000000000000000".substring(Integer.toBinaryString(z).length()) + Integer.toBinaryString(z));
}
}
输出:
In decimal: 5, In Binary: 0000000000000101
In decimal: 10, In Binary: 0000000000001010
In decimal: 20, In Binary: 0000000000010100
通知行int bit = key % INT_SIZE; // which is 5 % 32 according to your code
所以现在bit = 5 // because 5 % 32 = 5
现在int bitMask = 1 << bit; // you're saying shit 1 to five bits to left
in 32 bits 1 = 000000000000000000000000000000000001
左移5位后变为:
000000000000000000000000000000000100000 = 32 //in binary that is why bitmask continas 32
现在我们来谈谈|=
运算符
|
是一个按位或运算符,您只是将其用作复合赋值
bitArr[ind] |= bitMask is similar to bitArr[ind] = bitArr[ind] | bitmask
例如说bitArr[ind] equals 5 and bitmask equals 3
现在bitArr[ind] | bitmask
意味着5 | 3
它将与二进制表示进行按位或运算
表示 101 | 011
变成 111
即 7