>> และ << หมายถึงอะไรใน Python?


94

ฉันสังเกตว่าฉันสามารถทำสิ่งต่างๆเช่น2 << 5รับ 64 และ1000 >> 2รับ 250

ฉันยังสามารถใช้>>ในprint:

print >>obj, "Hello world"

เกิดอะไรขึ้นที่นี่?



3
ตอนนี้คุณสามารถเสียบสัญลักษณ์เหล่านั้นเข้ากับเครื่องมือค้นหาและค้นหาได้จริง: symbolhound.com
user2357112 รองรับ Monica


3
@ user2357112 นั่นจะเป็นประโยชน์มากขอบคุณ และสำหรับผู้ที่บอกว่าเป็นคำถามพื้นฐานอาจเป็นได้ แต่ฉันไม่มีแนวคิดเกี่ยวกับตัวดำเนินการระดับบิตดังนั้นฉันจึงไม่เคยคิดที่จะค้นหาสิ่งนั้นในเอกสาร ...
user3201152

@joaquin ตอนนี้เป็นผลการค้นหาอันดับหนึ่งใน Google สำหรับ python ที่มากกว่ามากกว่า
Jordan Reiter

คำตอบ:


64

ฉันคิดว่ามันเป็นคำถามที่สำคัญและยังไม่มีคำตอบ (ดูเหมือนว่า OP จะรู้แล้วเกี่ยวกับตัวดำเนินการกะ) ให้ฉันพยายามตอบตัวดำเนินการ >> ในตัวอย่างของคุณถูกใช้เพื่อวัตถุประสงค์สองอย่างที่แตกต่างกัน ในเงื่อนไข c ++ ตัวดำเนินการนี้มีงานมากเกินไป ในตัวอย่างแรกจะใช้เป็นตัวดำเนินการแบบบิต (การเลื่อนไปทางซ้าย) ในขณะที่ในสถานการณ์ที่สองจะใช้เป็นการเปลี่ยนทิศทางเอาต์พุตเท่านั้น กล่าวคือ

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, 

ตัวอย่าง

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

ปรับปรุง:

ใน python 3 เป็นไปได้ที่จะให้อาร์กิวเมนต์ไฟล์โดยตรงดังนี้:

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

13
FYI ว่าการใช้ตัวดำเนินการ shift ที่ถูกต้องอื่น ๆ ที่คุณอาจเห็นในรหัส Python จะเกิดขึ้นในไฟล์ Airflow เฟรมเวิร์ก Airflow โอเวอร์โหลดโอเปอเรเตอร์ '>>' เพื่อระบุว่างานหนึ่งอัป
สตรีม

3
คุณสามารถแทนที่ตัวดำเนินการเหล่านี้ได้โดยใช้__rshift__and __lshift__method
trudolf

ฉันได้ 2 >> 5 เท่ากับ 0 ฉันคิดว่ามันควรจะเท่ากับ 0.0001?
lightbox142

1
@ teter123f การดำเนินการเป็นไบนารี มันไม่ใช่การดำเนินการทศนิยม
yosemite_k

62

นี่คือตัวดำเนินการกะบิต

อ้างจากเอกสาร :

x << y

ส่งกลับxด้วยบิตที่เลื่อนไปทางซ้ายโดยตำแหน่ง y (และบิตใหม่ทางด้านขวามือเป็นเลขศูนย์) นี้เป็นเช่นเดียวกับการคูณโดยx2**y

x >> y

ส่งกลับxด้วยบิตที่เลื่อนไปทางขวาโดยตำแหน่ง y นี้เป็นเช่นเดียวกับการหารโดยx2**y


2
บางทีอาจจะเป็นตัวอย่างที่จะช่วยให้พิมพ์ชุดของเหล่านี้ในหลาม: print bin(1), print bin(1 << 1), print bin(17), print bin(17 >> 1)และอื่น ๆ คุณสามารถดูวิธีการทำงานโดยไม่มีคำอธิบาย
bartekbrak

4
ตัวดำเนินการ Bit shift ต้องการตัวถูกดำเนินการ 2 ตัวเหตุใดตัวถูกดำเนินการจึงเป็น "พิมพ์" และตัวถูกดำเนินการ 2 เป็นวัตถุ เช่นเดียวกับprint >>obj, "Hello world"
Qi Fan

เป็นคำตอบสำหรับบริบทที่ OP ให้ไว้ (ซึ่งเรียกว่า OP) ไม่ใช่คำถามที่ถาม
z33k

1
@Qi Fan @ z33k คำถามถูกแก้ไขเพื่อเพิ่มการอ้างอิงเพื่อพิมพ์มากกว่าหนึ่งปีหลังจากที่เขียนคำตอบนี้ คำถามเดิมกล่าวถึงเท่านั้น2 << 5และ1000 >> 2 ¯_ (ツ) _ / ¯
เจมส์

26

12 << 2

48

ค่าไบนารีที่แท้จริงของ 12 คือ "00 1100" เมื่อเราดำเนินการตามคำสั่งด้านบน Left shift (2 ตำแหน่งที่เลื่อนไปทางซ้าย) จะส่งกลับค่า 48 ค่าไบนารีของมันคือ "11 0000"

48 >> 2

12

ค่าไบนารีของ 48 คือ "11 0000" หลังจากดำเนินการคำสั่งด้านบน Right shift (2 ตำแหน่งที่เลื่อนไปทางขวา) จะคืนค่า 12 ค่าไบนารีของมันคือ "00 1100"


13

เป็นตัวดำเนินการกะบิตที่มีอยู่ในภาษาโปรแกรมหลักหลายตัว<<คือกะซ้ายและ>>กะขวาสามารถแสดงได้ดังตารางต่อไปนี้สมมติว่าจำนวนเต็มใช้เวลาเพียง 1 ไบต์ในหน่วยความจำ

| 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 |

ค้นหาคำอธิบายนี้อย่างถูกต้อง
shaik moeed

12

อีกกรณีหนึ่งที่เกี่ยวข้องprint >>obj, "Hello World"คือไวยากรณ์ "print chevron" สำหรับprint คำสั่งใน Python 2 (ลบออกใน Python 3 แทนที่ด้วยfileอาร์กิวเมนต์ของprint() ฟังก์ชัน ) แทนที่จะเขียนไปยังเอาต์พุตมาตรฐานเอาต์พุตจะถูกส่งผ่านไปยังobj.write()เมธอด ตัวอย่างทั่วไปจะเป็นวัตถุไฟล์ที่มีwrite()วิธีการ ดูคำตอบของคำถามที่มากขึ้นล่าสุด: ดับเบิลเครื่องหมายมากกว่าในหลาม


7

นี่คือตัวดำเนินการกะ

x << y ส่งกลับ x โดยที่บิตเลื่อนไปทางซ้ายโดยตำแหน่ง y (และบิตใหม่ทางด้านขวามือเป็นศูนย์) นี่ก็เหมือนกับการคูณ x ด้วย 2 ** y

x >> y ส่งกลับ x โดยที่บิตเลื่อนไปทางขวาโดยตำแหน่ง y นี่ก็เหมือนกับ // 'ing x คูณ 2 ** y



-1

ฉันตรวจสอบสิ่งต่อไปนี้ทั้งใน Python 2.7 และ Python 3.8

ฉันพิมพ์ (100 << 3) การแปลง 100 เป็นไบนารีให้ 1100100 สิ่งที่ฉันทำคือฉันทิ้ง 3 บิตแรกและเพิ่ม 3 บิตด้วยค่า '0' ในตอนท้าย ดังนั้นมันควรได้ผลลัพธ์เป็น 0100000 และฉันแปลงนี่เป็นทศนิยมและคำตอบคือ 32

สำหรับความประหลาดใจของฉันเมื่อฉันดำเนินการพิมพ์ (100 << 3) คำตอบคือ 800 ฉันงงงวย ฉันแปลง 800 เป็น Binary เพื่อตรวจสอบสิ่งที่เกิดขึ้น และนี่คือสิ่งที่ฉันได้มา 1100100000

หากคุณเห็นว่า 800 คือคำตอบ Python พวกเขาไม่ได้เลื่อนหรือวาง 3 บิตแรก แต่เพิ่มค่า '0' เป็น 3 บิตสุดท้าย

ในขณะที่พิมพ์ (100 >> 3) ทำงานได้สมบูรณ์แบบ ฉันทำการคำนวณด้วยตนเองและตรวจสอบผลการพิมพ์จาก python มันทำงานได้อย่างถูกต้อง ทิ้ง 3 บิตสุดท้ายและเพิ่มค่า '0' เป็น 3 บิตแรก

ดูเหมือนว่า (100 << 3) ตัวดำเนินการ shift ด้านซ้ายมีข้อบกพร่องใน Python


ไม่มีข้อผิดพลาดไม่ จำกัด เพียง 8 บิตต่อหมายเลข
Oso

ทั้ง << และ >> opertors ควรทำงานด้วยตรรกะเดียวกัน แต่ << ตัวดำเนินการทำงานแตกต่างกัน ฉันยื่นข้อบกพร่องด้านพฤติกรรมด้วย Python เพียงแค่ jow
Nandish
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.