左移运算符,Java:0 / 2 如何不抛出错误

Left Shift Operator, Java : How does 0 / 2 doesn't throws error

我正在研究这个 video,寻找一个非常著名的位操作问题

他写了这篇声明

count -= (1 << ((length - 1) / 2));

我无法理解。 考虑如果我将长度传递为 1,为什么这个语句不会抛出 ArithmeticException 对于 0 / 2.

我错过了这里的核心基础知识。 请帮帮我。

完整代码供参考:

public int solve(int A) {
        if(A == 0)
            return 0;
        
        int result = 1;    
        int length = 1;
        int count = 1;
        
        while(count < A) {
            length++;
            count += (1 << ((length - 1) / 2));
            
        }
        
        count -= (1 << ((length - 1) / 2));
        
        int offset = A - count - 1;
        
        result |= (1 << (length - 1));
        result |= offset << (length / 2);
        
        int halfShiftedNumber = (result >> (length / 2));
        int reversedNumber = getReversedNumber(halfShiftedNumber);
        
        result |= reversedNumber;
        
        return result;
    }
    
    int getReversedNumber(int A) {
        int result = 0;
        
        while(A > 0) {
            int lsb = (A & 1);
            
            result |= lsb;
            
            result = result << 1;
            A = A >> 1;
        }
        result = result >> 1;
        return result;
    }

如果我将 1 作为函数的输入传递怎么办...它应该抛出 ArithmeticException。 但它不是..

谁能帮我解释一下这些基本的东西。

谢谢!

0 / NaturalNumber 是一个有效的数学运算,将产生 0。所以编程语言支持该操作。 (这也适用于负数和浮点数)

在相关上下文中,0 作为分母未定义。

因此,对于 AnyNumber / 0 操作,编程语言可以抛出异常。

需要考虑的问题

请注意,当长度为零或负数时(因此 length-1 为负数),将导致意外结果。

  1. 在整数的上下文中,somenumber << -value类似于somenumber << ((32 - value) % 32)
  2. 在长的上下文中,somenumber << -value类似于somenumber << ((64 - value) % 64)