22

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

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

4

4 回答 4

38

计算机是二进制设备。因此,数字由 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)
于 2010-10-13T06:06:43.187 回答
5

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

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

   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 << 1

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

001110

如果您移动不止一个,那么它只会将位移动得更远。

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

从数学上讲,如果你取一个整数(并忽略溢出的风险,这是由计算机用完空间来存储位引起的)左移 1(<< 1)相当于乘以 2,然后移位右除以 1 相当于除以 2。(想一想二进制数学中的“位值”值多少,这是有道理的)

于 2010-10-13T06:11:31.267 回答
4

>>SHIFT RIGHT操作员

例子:

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

输出 :20>>2 = 5

解释:

的二进制值为2000000000000000000000000000010100

将所有位2位置向右移动00000000000000000000000000000101

它会给5( 1*2^2 + 0*2^1 + 1*2^0)

于 2010-10-13T06:10:16.887 回答
0

我曾经写了一个 JApplet (bitorgel) 并将它放在我的网页上,在那里人们可以玩弄位运算符。您可以现场试用,或下载源代码。AFAIK 它们在 C、C++ 和 Java 中的工作方式相同——可能也在 C# 中。

于 2012-05-17T02:06:07.273 回答