2010-10-13 72 views

回答

26

计算机是二进制设备。因此,数字由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) 

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

二进制数字系统或base-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) 
+3

实际上,它除以两个,并且由两个中的另一个相乘。 – 2010-10-13 11:37:49

+2

@Joeri Hendrickx:对于整数,实际上'''实际上是相同的除以2(它轮回取决于确切的格式)和'<<'实际上是相同的乘以二。如果您需要在没有乘法/除法指令的处理器上进行乘/除,那么这是一个有用的“技巧”。请记住,这个技巧只适用于整数。试图在浮点数上使用这个技巧会导致垃圾。 – 2010-10-13 19:44:07

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

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

3

我可以假设我说的就是孩子知道一些关于二进制? :)

所有数字可以在某种二进制来表示,像这样:

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一个号码产生这样的:

转移所有位向左由一个,产生此:

如果你转移不止一个,那么它只是进一步移动这些位。现在

,这取决于你使用的是什么语言,那种你正在使用的数字,它可以是一个有点复杂多了。例如,如果你是在一个语言工作,其中“最显著位”(最远的一个在若干左)代表的数量是有符号还是不行,那么语言将不得不考虑到这一点。在数学上,如果你取一个整数(并忽略溢出的风险,这是由于计算机空间不足以存储位造成的),向左移1(< < 1)等于乘以2,右移1等于除以2.(想想关于二进制数学中的“地点值”是多少值得的,那会有道理的)

0

我曾经写过an JApplet (bitorgel) and put it on my web page,其中一个可以和位操作员一起玩。你可以试试它,或者下载源代码。 AFAIK他们在C,C++和Java中的工作方式都是一样的 - 也许在C#中也是如此。

相关问题