Dan*_*Dan 5 java bitwise-operators
今天我正在学习左移位操作符(<<).据我所知,左移位操作符按指定向左移动位.而且我知道转移乘以2.但我很困惑,就像"移位"究竟是什么意思一样,为什么当用不同的类型赋值时输出会有所不同?
当我调用下面的函数时,它输出为 System.out.println("b="+b); //Output: 0
而我的问题是:b如何变为0,为什么b被类型化?
public void leftshiftDemo()
{
byte a=64,b;
int i;
i=a << 2;
b=(byte)(a<<2);
System.out.println("i="+i); //Output: 256 i.e 64*2^2
System.out.println("b="+b); //Output: 0 how & why b is typecasted
}
Run Code Online (Sandbox Code Playgroud)
更新(新疑点):
它是什么意思"如果你将1位移到高位(位31或63),该值将变为负数".例如.
public void leftshifHighOrder()
{
int i;
int num=0xFFFFFFE;
for(i=0;i<4;i++)
{
num=num<<1;
System.out.println(num);
/*
* Output:
* 536870908
* 1073741816
* 2147483632
* -32 //how this is -ve?
*/
}
}
Run Code Online (Sandbox Code Playgroud)
当整数在Java中转换为字节时,只保留最低位:
将有符号整数缩小到整数类型T只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数.除了可能丢失有关数值大小的信息之外,这可能导致结果值的符号与输入值的符号不同.
在这种情况下,该字节64具有以下二进制表示:
01000000
Run Code Online (Sandbox Code Playgroud)
shift运算符将值提升为int:
00000000000000000000000001000000
Run Code Online (Sandbox Code Playgroud)
然后左移2位:
00000000000000000000000100000000
Run Code Online (Sandbox Code Playgroud)
然后我们将它转换回一个字节,所以我们丢弃除最后8位之外的所有内容:
00000000
Run Code Online (Sandbox Code Playgroud)
因此最终的字节值是0.但是,您的整数保留所有位,因此它的最终值确实如此256.
| 归档时间: |
|
| 查看次数: |
8294 次 |
| 最近记录: |