>> 在 Java 中做啥?

Posted

技术标签:

【中文标题】>> 在 Java 中做啥?【英文标题】:What does >> do in Java?>> 在 Java 中做什么? 【发布时间】:2011-04-24 16:24:07 【问题描述】:

好的,我尝试查找 >> 或 shift 的含义,但正如本网站所解释的那样,这让我无法理解:http://www.janeg.ca/scjp/oper/shift.html

如果和孩子说话,会是什么解释?

【问题讨论】:

链接已损坏。 【参考方案1】:

计算机是二进制设备。因此,数字由 1 和 0 的序列表示。

比特移位只是将这些 1 和 0 的序列向左或向右移动。

所以>> 运算符所做的只是将位向右移动一位。

考虑数字 101:

// Assuming signed 8-bit integers
01100101 // How 101 is represented in binary
00110010 // After right shifting one bit, this represents 50

在这种情况下,最低有效位被截断。显然,魔鬼在细节中,但这就是它的全部。

<< 操作符做相反的操作:

// Assuming signed 8-bit integers
01100101 // How 101 is represented in binary
11001010 // After left shifting one bit, this represents -54

// Assuming unsigned 8-bit integers
01100101 // How 101 is represented in binary
11001010 // After left shifting one bit, this represents 202

在这种情况下,最高有效位被截断,因为我只使用了 8 位。但是,如果数字有更多位:

// Assuming signed 16-bit integers
00000000 01100101 // How 101 is represented in binary
00000000 11001010 // After left shifting one bit, this represents 202
00000001 10010100 // After left shifting one bit again, this represents 404

因此,您可能会得到不同的数字,具体取决于您正在处理的位数和与这些位相关的数据类型。

附录:如果您想知道二进制的工作原理,请考虑十进制数字系统的工作原理。考虑数字 5287。它可以这样写:

5287

但你也可以这样写:

5287 = (5 * 1000) + (2 * 100) + (8 * 10) + (7 * 1)

然后你可以这样写出来:

5287 = (5 * 10^3) + (2 * 10^2) + (8 * 10^1) + (7 * 10^0)

上面的等式解释了为什么十进制数系统有时被称为以 10 为底的系统。十进制数系统使用 10 位数字 (0-9)。注意指数如何对应数字位置。

二进制数字系统,或以 2 为底的系统,是完全相同的东西,但数字 2 作为指数的底数,并且只使用两个数字:0 和 1。

5287 = 00010100 10100111 (base 2)
     = (0 * 2^15) + (0 * 2^14) + (0 * 2^13) + (1 * 2^12)
     + (0 * 2^11) + (1 * 2^10) + (0 * 2^9)  + (0 * 2^8)
     + (1 * 2^7)  + (0 * 2^6)  + (1 * 2^5)  + (0 * 2^4)
     + (0 * 2^3)  + (1 * 2^2)  + (1 * 2^1)  + (1 * 2^0)

【讨论】:

实际上,它除以二,另一个乘以二。 @Joeri Hendrickx:对于整数,>> 实际上与除以 2 相同(取整方式取决于确切格式),<< 实际上与乘以 2 相同.如果您需要在没有乘法/除法指令的处理器上乘以/除以 2,这是一个有用的“技巧”。请记住,此技巧仅适用于整数。在浮点数上尝试这种技巧会导致垃圾。【参考方案2】:

我可以假设我正在与之交谈的孩子对二进制有点了解吗? :)

所有数字都可以用某种二进制表示,如下所示:

   Base 10 : Base 2
   1 : 0001
   2 : 0010
   3 : 0011
   4 : 0100
   5 : 0101
   6 : 0110
   7 : 0111
   8 : 1000

... 等等。

移位运算符基本上将所有位(1 或 0)移动到一个位置。因此,例如: 000111 >> 1

将 000111 中的所有位右移一个数字以产生:

000011

000111

将所有这些位左移一位,以产生这个:

001110

如果你移动不止一个,那么它只会移动更多位。

现在,根据您使用的语言和使用的数字类型,可能会比这更复杂一些。例如,如果您使用的语言中“最高有效位”(数字中最左边的位)表示该数字是否有符号,则该语言必须考虑到这一点。

从数学上讲,如果你取一个整数(并忽略溢出的风险,这是由计算机耗尽存储位的空间引起的)左移 1 (

【讨论】:

【参考方案3】:

>>SHIFT RIGHT 运算符

例子:

class X
       
       public static void main(String args[])
       
         System.out.println("20>>2 = "+20>>2);
       
              

输出:20>>2 = 5

解释:

20的二进制值为:00000000000000000000000000010100

将所有位 2 向右移动 00000000000000000000000000000101

它会给51*2^2 + 0*2^1 + 1*2^0

【讨论】:

【参考方案4】:

我曾经写过an JApplet (bitorgel) and put it on my web page,可以在其中使用位运算符。您可以现场试用,或下载源代码。 AFAIK 它们在 C、C++ 和 Java 中的工作方式相同——可能也在 C# 中。

【讨论】:

以上是关于>> 在 Java 中做啥?的主要内容,如果未能解决你的问题,请参考以下文章

“?”是啥意思?和“:”在布尔语句中做啥? [复制]

<!-- 在Javascript中做啥?

~> 运算符是做啥的? [复制]

startMonitoringFromRegion - 在 didEnterRegion 中做啥?

JavaScript 与Java、Java applet都有啥区别?各是做啥的?

如何发布java web项目,需要做啥配置?