好吧,我试图寻找了一下>>,或转移手段,但它的方式在我的头上,因为这网站解释它:http://www.janeg.ca/scjp/oper/shift.html>>在java中做什么?
所以有人可以解释它像他们说话的孩子吗?
好吧,我试图寻找了一下>>,或转移手段,但它的方式在我的头上,因为这网站解释它:http://www.janeg.ca/scjp/oper/shift.html>>在java中做什么?
所以有人可以解释它像他们说话的孩子吗?
计算机是二进制设备。因此,数字由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)
>>
的SHIFT RIGHT
操作者
实施例:
class X
{
public static void main(String args[])
{
System.out.println("20>>2 = "+20>>2);
}
}
输出:20>>2 = 5
说明:
的20
二进制值是:00000000000000000000000000010100
移所有位2
位置向右00000000000000000000000000000101
它会给5
(2*2^2+0*2^1+1*2^0
)
我可以假设我说的就是孩子知道一些关于二进制? :)
所有数字可以在某种二进制来表示,像这样:
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.(想想关于二进制数学中的“地点值”是多少值得的,那会有道理的)
我曾经写过an JApplet (bitorgel) and put it on my web page,其中一个可以和位操作员一起玩。你可以试试它,或者下载源代码。 AFAIK他们在C,C++和Java中的工作方式都是一样的 - 也许在C#中也是如此。
实际上,它除以两个,并且由两个中的另一个相乘。 – 2010-10-13 11:37:49
@Joeri Hendrickx:对于整数,实际上'''实际上是相同的除以2(它轮回取决于确切的格式)和'<<'实际上是相同的乘以二。如果您需要在没有乘法/除法指令的处理器上进行乘/除,那么这是一个有用的“技巧”。请记住,这个技巧只适用于整数。试图在浮点数上使用这个技巧会导致垃圾。 – 2010-10-13 19:44:07