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

问题描述

我正在研究这个 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. 在long的上下文中,somenumber << -value类似于somenumber << ((64 - value) % 64)