>> và << có nghĩa là gì trong Python?


90

Tôi nhận thấy rằng tôi có thể làm những việc như 2 << 5đạt 64 và 1000 >> 2nhận 250.

Ngoài ra tôi có thể sử dụng >>trong print:

print >>obj, "Hello world"

Có chuyện gì đang xảy ra ở đây?



3
Ở đây, bây giờ bạn có thể cắm những biểu tượng thành một công cụ tìm kiếm và có nó thực sự tìm kiếm cho họ: symbolhound.com
user2357112 hỗ trợ Monica

có thể có bản sao của Hoạt động và Sử dụng Bitwise
vaultah

3
@ user2357112 Điều đó sẽ thực sự hữu ích, cảm ơn. Và để những người nói đó là một câu hỏi cơ bản, nó có thể được, nhưng tôi không có khái niệm về toán tử Bitwise, vì vậy tôi sẽ không bao giờ có suy nghĩ để tìm thấy trong tài liệu hướng dẫn ...
user3201152

@joaquin hiện là kết quả số một trong google cho python lớn hơn lớn hơn.
Jordan Reiter

Câu trả lời:


63

Tôi nghĩ đó là câu hỏi quan trọng và nó vẫn chưa được trả lời (OP dường như đã biết về các nhà điều hành ca). Hãy để tôi thử trả lời, toán tử >> trong ví dụ của bạn được sử dụng cho hai mục đích khác nhau. Trong điều kiện c ++, toán tử này được nạp chồng. Trong ví dụ đầu tiên, nó được sử dụng như toán tử bitwise (dịch chuyển sang trái), trong khi trong trường hợp thứ hai, nó chỉ được sử dụng như chuyển hướng đầu ra. I E

2 << 5 # shift to left by 5 bits
2 >> 5 # shift to right by 5 bits
print >> obj, "Hello world" # redirect the output to obj, 

thí dụ

with open('foo.txt', 'w') as obj:
    print >> obj, "Hello world" # hello world now saved in foo.txt

cập nhật:

Trong python 3, có thể cung cấp đối số tệp trực tiếp như sau:

print("Hello world", file=open("foo.txt", "a")) # hello world now saved in foo.txt

11
FYI rằng một cách sử dụng phổ biến khác của toán tử dịch phải mà bạn có thể thấy trong mã Python sẽ xảy ra trong tệp Luồng khí. Khung Airflow quá tải '>>' nhà điều hành để chỉ ra một nhiệm vụ là thượng nguồn từ khác: stackoverflow.com/questions/52389105/...
schimmy

3
bạn thực sự có thể ghi đè các toán tử này thông qua các phương thức __rshift____lshift__.
trudolf

Tôi nhận được rằng 2 >> 5 bằng 0. Tôi nghĩ rằng nó phải bằng 0,0001?
lightbox142

1
@ teter123f hoạt động là nhị phân. nó không phải là hoạt động thập phân.
yosemite_k

61

Đây là các toán tử dịch chuyển theo bit.

Trích dẫn từ tài liệu :

x << y

Trả về xvới các bit được dịch chuyển sang trái bởi các vị trí y (và các bit mới ở phía bên phải là số không). Điều này cũng giống như nhân xvới 2**y.

x >> y

Trả về xvới các bit được dịch chuyển sang phải theo y vị trí. Điều này cũng giống như chia xcho 2**y.


2
Có lẽ một ví dụ sẽ giúp đỡ, gõ một loạt các bằng Python: print bin(1), print bin(1 << 1), print bin(17), print bin(17 >> 1)và vân vân. Bạn có thể thấy nó hoạt động như thế nào mà không cần giải thích.
bartekbrak

4
Toán tử dịch chuyển bit yêu cầu 2 toán hạng vậy tại sao toán hạng là "print" và toán hạng 2 là một đối tượng? as inprint >>obj, "Hello world"
Qi Fan

Đó là câu trả lời cho ngữ cảnh OP đã cung cấp (và do đó OP đã biết) chứ không phải cho câu hỏi được hỏi.
z33k

@Qi Fan @ z33k Câu hỏi đã được chỉnh sửa để bổ sung tài liệu tham khảo để in hơn một năm sau khi câu trả lời này được viết. Câu hỏi ban đầu chỉ được đề cập 2 << 51000 >> 2 ¯_ (ツ) _ / ¯
James

24

12 << 2

48

Giá trị nhị phân thực tế của 12 là "00 1100" khi chúng ta thực hiện câu lệnh trên Dịch trái (dịch chuyển 2 vị trí sang trái) trả về giá trị 48 Giá trị nhị phân của nó là "11 0000".

48 >> 2

12

Giá trị nhị phân của 48 là "11 0000", sau khi thực hiện câu lệnh trên Dịch phải (2 vị trí dịch sang phải) trả về giá trị 12 giá trị nhị phân của nó là "00 1100".


12

Trường hợp khác có liên quan print >>obj, "Hello World"là cú pháp "in chevron" cho print câu lệnh trong Python 2 (bị loại bỏ trong Python 3, được thay thế bằng fileđối số của print() hàm ). Thay vì ghi vào đầu ra chuẩn, đầu ra được chuyển tới obj.write()phương thức. Một ví dụ điển hình sẽ là các đối tượng tệp có một write()phương thức. Xem câu trả lời cho một câu hỏi gần đây hơn: Dấu lớn hơn gấp đôi trong Python .


11

Chúng là toán tử dịch chuyển bit tồn tại trong nhiều ngôn ngữ lập trình chính thống, <<là dịch chuyển trái và >>là dịch chuyển phải, chúng có thể được chứng minh như bảng sau, giả sử một số nguyên chỉ chiếm 1 byte trong bộ nhớ.

| operate | bit value | octal value |                       description                        |
| ------- | --------- | ----------- | -------------------------------------------------------- |
|         | 00000100  |           4 |                                                          |
| 4 << 2  | 00010000  |          16 | move all bits to left 2 bits, filled with 0 at the right |
| 16 >> 2 | 00000100  |           4 | move all bits to right 2 bits, filled with 0 at the left |

Đang tìm kiếm chính xác lời giải thích này.
shaik moeed

7

Đây là những người vận hành ca

x << y Trả về x với các bit được dịch chuyển sang trái bởi y vị trí (và các bit mới ở phía bên tay phải là số không). Điều này cũng giống như nhân x với 2 ** y.

x >> y Trả về x với các bit được y chuyển sang phải. Điều này giống với // 'ing x x 2 ** y.


0
<< Mean any given number will be multiply by 2the power
for exp:- 2<<2=2*2'1=4
          6<<2'4=6*2*2*2*2*2=64
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.