关于java中的移位,例如
int a=-8;
System.out.println(a>>>33);//2147483644
System.out.println(a>>>1); //2147483644
这里我采用了逻辑右移(无符号右移)为例,对-8进行逻辑右移,移动33位和移动1位的效果是一样的,其原因是移动33位时对其进行取模操作(与32相除的余数),对其余数进行移位,请问Java中这样设计的理由是什么?为什么不是当逻辑右移超过32位时,其结果应该为0,这样不是更符合常理吗?
巴扎黑2017-04-17 17:42:08
누군가 내 답변에 의문을 제기하는 것을 보고 변경했습니다
원래 포스터에서 말한 내용은 왜 교대근무 33이 0으로 직접 설정되지 않았습니까?
이렇게 연산을 하면 일단 심플코드에 매직넘버가 많이 나오거든요~ 왜냐하면 33으로 쉬프트하면 0도 될 수 있고, 34로 쉬프트하면 0이 되기 때문입니다. 도 0이 됩니다....
이렇게 하면 더 이상 기준이 없고, 쉬프트 연산을 단계별로 수행해야 합니다(값을 저장한 후 계산 등). 이런 무제한 이동은 반드시 수행되어야 합니다. 컴퓨터와 언어 디자이너에게는 허용되지 않습니다! ! ! !
*교대 연산은 단순히 기본 2의 곱셈과 2의 나눗셈입니다. 우선 관점을 말씀드리고 싶습니다! 0이 아닌 숫자를 2^n으로 나누면 0이 됩니다. 수학에 대해 조금 아는 사람은 1>> 1이 0<인 이유를 쉽게 알 수 있습니다. 🎜>의 결과? ? ? 비트 연산은 정수에서만 작동하므로 이는 0.5 대신 1/2을 0으로 직접 사용하는 것과 동일한 개념입니다.
大家讲道理2017-04-17 17:42:08
시프트 연산은 효율이 높기 때문에 */
방법을 최적화하는 데 자주 사용됩니다. 한 위치를 왼쪽으로 이동하는 것은 *2
과 동일하고, 한 위치를 오른쪽으로 이동하는 것은 /2
과 동일합니다. 물론 이는 일정한 조건 내에서이다.
>>>
의 不合理
33비트 쉬프트는 모듈로 연산을 한 후 쉬프트를 수행하는 옵션이겠죠? 일부 특수 알고리즘(예: MD5
암호화 알고리즘)을 수행하는 등 다른 용도로 사용해야 합니다.
1층에서 설명한 내용은 동의할 수 없습니다. 이동, 곱셈 및 나눗셈은 동일하며 프로그래머로서 이를 사용할 때 주의해야 합니다. 개인적으로 Java의 Shift 연산은 이미 C의 특성을 어느 정도 갖추고 있다고 생각합니다. 이는 프로그래머가 이를 잘 사용하려면 특정 기본 기술이 필요한 최하위 수준의 연산입니다.