好的,我试图查找“>>”或shift的含义,但是这个网站的解释超出了我的理解范围:http://www.janeg.ca/scjp/oper/shift.html
如果向一个孩子解释,该怎么说呢?
好的,我试图查找“>>”或shift的含义,但是这个网站的解释超出了我的理解范围:http://www.janeg.ca/scjp/oper/shift.html
如果向一个孩子解释,该怎么说呢?
计算机是二进制设备。因此,数字用一系列的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)
>>
实际上与除以二相同(其舍入方式取决于精确格式),<<
实际上与乘以二相同。如果需要在没有乘除指令的处理器上进行乘除二的操作,这是一个有用的“技巧”。请记住,这个技巧只适用于整数。尝试在浮点数上使用此技巧将产生垃圾结果。 - In silico我可以假设我和孩子谈话时他们对二进制有一定的了解吗? :)
所有数字都可以用某种形式的二进制表示,如下所示:
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
将000111中的所有位向左移动一位,产生以下结果:
001110
如果您移动超过一个位,它只会进一步移动位。
现在,这取决于您使用的语言和正在使用的数字类型,可能会比那更复杂。例如,如果您使用的语言中“最高有效位”(数字中最左边的位)表示数字是否带符号,则该语言必须考虑到这一点。
从数学上讲,如果您取一个整数(并忽略溢出的风险,这是由计算机存储位的空间不足引起的),左移1位(<< 1)等于乘以2,右移1位等于除以2。(想一想二进制数学中的“位置值”价值是多少,这就有意义了)
>>
位移运算符(右移)
例子:
class X
{
public static void main(String args[])
{
System.out.println("20>>2 = "+20>>2);
}
}
输出结果:20>>2 = 5
解释:
20
的二进制值为:00000000000000000000000000010100
将所有位向右移动 2
个位置:00000000000000000000000000000101
它将得到 5
(1*2^2 + 0*2^1 + 1*2^0
)
我曾经写过一个JApplet(bitorgel)并将其放在我的网页上,在那里可以玩弄位运算符。您可以在线尝试它,也可以下载源代码。据我所知,它们在C、C++和Java中的工作方式相同-可能在C#中也是如此。