今天我学习了左移位运算符(<<
)。正如我所理解的,左移位运算符将位移动到指定的左边。我也知道乘以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?
*/
}
}
当在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上有关循环移位的文章。
假设和在循环左移输出后应类似于 实际代码为: > 列表项