ฉันสังเกตว่าฉันสามารถทำสิ่งต่างๆเช่น2 << 5
รับ 64 และ1000 >> 2
รับ 250
ฉันยังสามารถใช้>>
ในprint
:
print >>obj, "Hello world"
เกิดอะไรขึ้นที่นี่?
ฉันสังเกตว่าฉันสามารถทำสิ่งต่างๆเช่น2 << 5
รับ 64 และ1000 >> 2
รับ 250
ฉันยังสามารถใช้>>
ในprint
:
print >>obj, "Hello world"
เกิดอะไรขึ้นที่นี่?
คำตอบ:
ฉันคิดว่ามันเป็นคำถามที่สำคัญและยังไม่มีคำตอบ (ดูเหมือนว่า 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
__rshift__
and __lshift__
method
นี่คือตัวดำเนินการกะบิต
อ้างจากเอกสาร :
x << y
ส่งกลับx
ด้วยบิตที่เลื่อนไปทางซ้ายโดยตำแหน่ง y (และบิตใหม่ทางด้านขวามือเป็นเลขศูนย์) นี้เป็นเช่นเดียวกับการคูณโดยx
2**y
x >> y
ส่งกลับx
ด้วยบิตที่เลื่อนไปทางขวาโดยตำแหน่ง y นี้เป็นเช่นเดียวกับการหารโดยx
2**y
print bin(1)
, print bin(1 << 1)
, print bin(17)
, print bin(17 >> 1)
และอื่น ๆ คุณสามารถดูวิธีการทำงานโดยไม่มีคำอธิบาย
print >>obj, "Hello world"
2 << 5
และ1000 >> 2
¯_ (ツ) _ / ¯
12 << 2
48
ค่าไบนารีที่แท้จริงของ 12 คือ "00 1100" เมื่อเราดำเนินการตามคำสั่งด้านบน Left shift (2 ตำแหน่งที่เลื่อนไปทางซ้าย) จะส่งกลับค่า 48 ค่าไบนารีของมันคือ "11 0000"
48 >> 2
12
ค่าไบนารีของ 48 คือ "11 0000" หลังจากดำเนินการคำสั่งด้านบน Right shift (2 ตำแหน่งที่เลื่อนไปทางขวา) จะคืนค่า 12 ค่าไบนารีของมันคือ "00 1100"
เป็นตัวดำเนินการกะบิตที่มีอยู่ในภาษาโปรแกรมหลักหลายตัว<<
คือกะซ้ายและ>>
กะขวาสามารถแสดงได้ดังตารางต่อไปนี้สมมติว่าจำนวนเต็มใช้เวลาเพียง 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 |
อีกกรณีหนึ่งที่เกี่ยวข้องprint >>obj, "Hello World"
คือไวยากรณ์ "print chevron" สำหรับprint
คำสั่งใน Python 2 (ลบออกใน Python 3 แทนที่ด้วยfile
อาร์กิวเมนต์ของprint()
ฟังก์ชัน ) แทนที่จะเขียนไปยังเอาต์พุตมาตรฐานเอาต์พุตจะถูกส่งผ่านไปยังobj.write()
เมธอด ตัวอย่างทั่วไปจะเป็นวัตถุไฟล์ที่มีwrite()
วิธีการ ดูคำตอบของคำถามที่มากขึ้นล่าสุด: ดับเบิลเครื่องหมายมากกว่าในหลาม
นี่คือตัวดำเนินการกะ
x << y ส่งกลับ x โดยที่บิตเลื่อนไปทางซ้ายโดยตำแหน่ง y (และบิตใหม่ทางด้านขวามือเป็นศูนย์) นี่ก็เหมือนกับการคูณ x ด้วย 2 ** y
x >> y ส่งกลับ x โดยที่บิตเลื่อนไปทางขวาโดยตำแหน่ง y นี่ก็เหมือนกับ // 'ing x คูณ 2 ** y
<< 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
ฉันตรวจสอบสิ่งต่อไปนี้ทั้งใน 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
<<
,>>
,&
,|
,~
และ^
ทำอย่างไร