当前位置: 首页 > 知识库问答 >
问题:

按位左移行为

谷弘致
2023-03-14

今天我学习了左移位运算符(<<)。正如我所理解的,左移位运算符将位移动到指定的左边。我也知道乘以2表示移位。但是我很困惑,比如“移位”到底是什么意思,为什么当赋值的类型不同时,输出会有所不同?

当我调用下面的函数时,它给出的输出为system.out.println(“b=”+b);//输出:0

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
}
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?
         */
    }
}

共有1个答案

叶元凯
2023-03-14

当在Java中将整数种姓为字节时,只保留最低顺序的位:

将有符号整数缩窄转换为整数类型T只是丢弃除n个最低阶位之外的所有位,其中n是用于表示类型T的位的数目。除了可能丢失关于数值大小的信息之外,这可能导致所得值的符号与输入值的符号不同。

在本例中,字节64具有以下二进制表示:

01000000
00000000000000000000000001000000
00000000000000000000000100000000
00000000

因此,最终的字节值为0。但是,您的整数保留了所有的位,因此它的最终值确实是256

 类似资料:
  • 我必须编写一个函数,对y位置的位进行左循环移位。例如,如果我将:01011000和2作为y,则函数必须返回011000001。 我已经尝试使用但它似乎是无用的。

  • 问题内容: 我有一个这样的测试程序: 它产生以下输出: 我期望(1)和(3)相同,以及(2)和(4)相同。 使用gcc版本:gcc.real(Ubuntu 4.4.1-4ubuntu9)4.4.1 怎么了? 问题答案: 根据C标准 §6.5.7.3 ,按类型大小移动是未定义的行为: 6.5.7按位移位运算符 (…)如果右操作数的值为负或大于 或等于 提升后的左操作数的宽度,则行为未定义。 您的编译

  • 问题内容: 当遇到按位移位运算符时,我遇到了一个有趣的场景。如果第二个操作数为负,按位移位运算如何工作?。 即,<< << b,“ <<”将a中的位模式向左移动b位。但是,如果b为负数,在运行时是否应该出错? 我能够成功运行以下代码,但我不知道它是如何工作的? 输入项 结果 “ a”的ASCII码为97。有人可以帮助我了解其工作原理吗? 问题答案: 但是,如果b为负数,在运行时是否应该出错? 不符

  • 问题内容: 我正在看《A Tour of Go》,我对他们的basic- types.go示例感到困惑: 难道不应该在无符号的64位整数中向左移动1 64个位置会导致溢出(也就是比MSB高一点)吗? 但是,直到该行更改为:编译器才会抱怨: 如果我编写一些代码以迭代不同长度的左移,包括如上例中那样导致导致编译器发声的左移65,我会看到两件事: 它的行为符合我的预期,因为它会将uint64中的1放置在

  • 问题内容: 我想知道如何实现由位表示的位串的k 循环 右移。 这些代码所做的全部是 返回0 ,如何使其循环移位? 问题答案: 这应该工作: 另请参阅Wikipedia上有关循环移位的文章。

  • 假设和在循环左移输出后应类似于 实际代码为: > 列表项