2013-06-20 37 views

Trả lời

16

Nhà điều hành >> giữ gìn dấu (đăng kéo dài), trong khi >>> zero các bit tận cùng bên trái (zero-kéo dài).

-10>>2 
res0: Int = -3 
-10>>>2 
res1: Int = 1073741821 

Try it out yourself.

Đây không phải là cần thiết trong các ngôn ngữ như C đã ký kết và các loại unsigned, không giống như Java, mà cũng có >>> (vì nó không có số nguyên unsigned).

+0

cảm ơn bạn, đây là ví dụ mà tôi cần phải hiểu ^^ – Kokizzu

+0

[đâu simplyscala đi?] (Https://www.reddit.com/r/scala/comments/3didyu/where_is_simplyscala_gone/) –

1

Chúng có cùng nghĩa như trong Java. Toán tử thay đổi bên trái đã ký "< <" thay đổi mẫu bit sang trái và toán tử dịch chuyển phải đã ký ">>" thay đổi mẫu bit sang phải. Mẫu bit được đưa ra bởi toán hạng bên trái, và số vị trí để dịch chuyển bởi toán hạng bên phải. Toán tử thay đổi phải không dấu ">>>" dịch số 0 vào vị trí ngoài cùng bên trái, trong khi vị trí ngoài cùng bên trái sau ">>" phụ thuộc vào phần mở rộng dấu.

+1

'>>>' chỉ tồn tại trong Java. –

+0

@JonathonReinhart https://github.com/scala/scala/blob/master/src/library/scala/Int.scala#L73 – 4lex1v

+0

... xin lỗi, ý tôi là nó tồn tại trong Java, chứ không phải C hoặc C++. –

2

Lưu ý: với SLIP 30 (tháng 11 năm 2015), Scala có thể kết thúc (năm 2016 2017?) Với 4 loại "nguyên thủy" để đại diện cho số nguyên unsigned: UByte, UShort, UIntULong.

Điều đó sẽ ảnh hưởng Bit shifting operations on UInts and ULongs, mà cũng minh họa sự khác biệt giữa >>>>>:

Shift trái << và chuyển logic đúng >>> cư xử theo cách rõ ràng.

Trường hợp số học thay đổi phải >> có thể gây tranh cãi.
Chúng tôi cho rằng nó không nên có sẵn trên các số nguyên unsigned vì hai lý do:

  • Đầu tiên, một số học dịch phải không xuất hiện để có bất kỳ ý nghĩa về số nguyên unsigned. Thay đổi số học chính xác nếu >>>. Do đó, tương tự như unary_-, không nên giới thiệu.
  • Thứ hai, ngôn ngữ hiện có mà không có loại unsigned integer, chẳng hạn như gia đình C, thực sự cung cấp ngữ nghĩa khác nhau để >> tuỳ thuộc vào việc nó có một ký kết hoặc unsigned toán hạng:
    Một >> trên một toán hạng unsigned không ký -mở rộng. Nó sẽ gây nhầm lẫn cho một nhà phát triển C cho x >> 3 để đăng ký mở rộng trong Scala, nhưng nó sẽ gây nhầm lẫn với một nhà phát triển Scala rằng x >> 3 không được gia hạn đăng ký. Vì vậy, chúng tôi muốn để nó ra hoàn toàn, và để cho một lỗi biên dịch được nâng lên.

Nếu thuật toán dựa trên bit-twiddling cần quyền dịch chuyển dấu mở rộng, bạn luôn có thể diễn giải lại như đã ký, thực hiện thao tác và diễn giải lại dưới dạng chưa ký: (x.toInt >> 3).toUInt.

Lưu ý: triển khai hiện tại cung cấp >>, cho đến khi chúng tôi đồng ý về điểm này.

Các vấn đề liên quan