理解一点操作

时间:2014-08-11 14:20:19

标签: java int bit

试图理解这一行代码:

int solution_mask |= 1 << (1+ solution.charAt(i) - 'A');

假设solution.charAt(i)是122.所以122-65 = 57。

1+ 57 = 58

1如何在solution_mask中向左移动58位,即solution_mask变量如何存储值58?

这里是完整的上下文代码:

 public static int[][] find(String guess, String soln) {

 int[][] res={0,0};
 int solution_mask = 0;
for (int i = 0; i < 4; ++i) {
 solution_mask |= 1 << (1 + solution.charAt(i) - ‘A’);
 }
 for (int i = 0; i < 4; ++i) {
 if (guess.charAt(i) == solution.charAt(i)) {
 res[0]++;
 } else if ((solution_mask &
 (1 << (1 + guess.charAt(i) - ‘A’))) >= 1) {
 res[1]++;
 }
 }
 return res;
 }

2 个答案:

答案 0 :(得分:1)

在Java中,在应用之前,移位被修改为32(或64,对于长)。

See this answer

这意味着1 << 58相当于1 << (58 % 32) <{1}}。1 << 26

答案 1 :(得分:0)

假设代码应该是这样的:

int solution_mask = 0;
...
for ( int i = 0; i < solution.length(); i++ ) {
  solution_mask |= 1 << (1+ solution.charAt(i) - 'A');
}

然后,这会在solution_mask中为solution字符串中的每个字符设置一位。结果将是一个位模式,指示解决方案中存在哪些字符。

E.G。如果solution字符串是&#34; ABDF&#34; solution_mask将是(二进制)1010110

如果solution包含A..Z[\]^_以外的任何行为者,并且会发生奇怪的事情,因为int只有32位宽。