Python'da >> ve << ne anlama geliyor?


94

2 << 564 ve 1000 >> 2250 almak gibi şeyler yapabildiğimi fark ettim .

Ayrıca ben kullanabilir >>in print:

print >>obj, "Hello world"

Burada ne oluyor?



3
Burada, şimdi bu sembolleri bir arama motoruna ekleyebilir ve gerçekten onları aramasını sağlayabilirsiniz: symbolhound.com
user2357112, Monica


3
@ user2357112 Bu gerçekten yardımcı olacak, teşekkürler. Ve bunun temel bir soru olduğunu söyleyenler için olabilir, ama bitsel operatörler kavramım yoktu, bu yüzden buna dokümantasyonda bakmayı asla düşünmezdim ...
user3201152

@joaquin artık google'da python'dan büyüktür.
Ürdün Reiter

Yanıtlar:


64

Bunun önemli bir soru olduğunu düşünüyorum ve henüz cevaplanmadı (OP, vardiya operatörlerini zaten biliyor gibi görünüyor). Cevap vermeye çalışayım, örneğinizdeki >> operatörü iki farklı amaç için kullanılıyor. C ++ terimleriyle bu operatör aşırı yüklenmiştir. İlk örnekte, bitsel operatör (sola kaydırma) olarak kullanılırken, ikinci senaryoda yalnızca çıktı yeniden yönlendirmesi olarak kullanılır. yani

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, 

misal

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

Güncelleme:

Python 3'te dosya argümanını aşağıdaki gibi doğrudan vermek mümkündür:

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

13
Python kodunda görebileceğiniz doğru vardiya operatörünün başka bir yaygın kullanımının Airflow dosyalarında gerçekleşeceğini unutmayın. Airflow çerçevesi, bir görevin diğerinden yukarı akışta olduğunu belirtmek için '>>' operatörünü aşırı yükler: stackoverflow.com/questions/52389105/…
schimmy

3
aslında bu operatörleri __rshift__ve __lshift__yöntemleri aracılığıyla geçersiz kılabilirsiniz .
trudolf

2 >> 5'in 0'a eşit olduğunu anlıyorum. 0.0001'e eşit olması gerektiğini düşündüm.
lightbox142

1
@ teter123f işlem ikilidir. ondalık işlem değildir.
yosemite_k

62

Bunlar bitsel kaydırma operatörleri.

Dokümanlardan alıntı :

x << y

İade xbit (sıfırdır sağ tarafında ve yeni bit) y yerlerine göre sola kaydırılır. Bu çarpılması ile aynıdır xgöre 2**y.

x >> y

İade xbit ile y yerlere sağa kaydırılır. Bu bölme ile aynıdır xgöre 2**y.


2
Belki bir örnek, yardım Python bu bir dizi yazarsınız: print bin(1), print bin(1 << 1), print bin(17), print bin(17 >> 1)vb. Açıklamalar olmadan nasıl çalıştığını görebilirsiniz.
bartekbrak

4
Bit kaydırma operatörü 2 işlenen gerektirir, öyleyse neden işlenen "yazdır" ve işlenen 2 bir nesne? olduğu gibiprint >>obj, "Hello world"
Qi Fan

Sorulan soruya değil, OP'nin sağladığı (ve dolayısıyla OP tarafından bilinen) bağlama bir cevaptır.
z33k

1
@Qi Fan @ z33k Soru, bu cevabın yazılmasının ardından bir yıldan fazla bir süre sonra baskıya referans eklemek için düzenlendi. Sadece bahsedilen asıl soru 2 << 5ve 1000 >> 2 ¯_ (ツ) _ / ¯
James

26

12 << 2

48

Yukarıdaki ifadeyi çalıştırdığımızda 12'nin gerçek ikili değeri "00 1100" dür. Sol kaydırma (sola kaydırılmış 2 yer), 48 değerini döndürür, bunun ikili değeri "11 0000" olur.

48 >> 2

12

48'in ikili değeri "11 0000" dir, yukarıdaki ifadeyi uyguladıktan sonra Sağa kaydırma (sağa kaydırılmış 2 basamak) 12 değerini döndürür, bunun ikili değeri "00 1100" dür.


13

Bunlar, birçok ana programlama dilinde var olan <<, sola kaydırma ve >>sağa kaydırma olan bit kaydırma operatörüdür , aşağıdaki tabloda gösterilebilirler, bir tamsayının bellekte yalnızca 1 bayt aldığını varsayarlar.

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

Tam olarak bu açıklama aranıyor.
shaik moeed

12

İçerdiği diğer durum , Python 2'deki ifadeprint >>obj, "Hello World" için "yazdırma köşeli çift ayraç" sözdizimidir (Python 3'te kaldırılmıştır , işlevin argümanı ile değiştirilmiştir ). Standart çıktıya yazmak yerine çıktı yönteme aktarılır . Tipik bir örnek, bir yöntemi olan dosya nesneleri olabilir . Daha yeni bir sorunun cevabına bakın: Python'da oturumdan iki kat büyük .print fileprint() obj.write()write()


7

Bunlar vardiya operatörleri

x << y Bitleri sola y basamak kaydırarak x'i döndürür (ve sağ taraftaki yeni bitler sıfırdır). Bu, x'i 2 ** y ile çarpmakla aynıdır.

x >> y Bitler sağa y basamak kaydırılmış olarak x'i döndürür. Bu, x'i 2 ** y'ye // yerleştirmekle aynıdır.


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

-1

Aşağıdakileri hem Python 2.7 hem de Python 3.8'de doğruladım

Baskı yaptım (100 << 3) 100'ü İkili'ye çevirmek 1100100 verir. Yaptığım şey ilk 3 biti düşürmek ve sonunda '0' değerine sahip 3 bit eklemek oldu. Yani 0100000 olarak sonuçlanmalı ve bunu Decimal'e çevirdim ve cevap 32 idi.

Yazdırmayı (100 << 3) çalıştırdığım zamanki sürprizim için cevap 800'dü. Şaşırmıştım. Neler olduğunu kontrol etmek için 800'ü Binary'ye çevirdim. Ve bu 1100100000 aldığım şey.

800'ün Python cevabının nasıl olduğunu görürseniz, ilk 3 biti kaydırmadılar veya düşürmediler, ancak son 3 bit için '0' değerini eklediler.

Baskı olarak nerede (100 >> 3), mükemmel çalıştı. Manuel hesaplama yaptım ve yazdırma sonucunu python'dan kontrol ettim. Doğru çalıştı. Son 3 bit düşürüldü ve ilk 3 bit'e '0' değeri eklendi.

Görünüşe göre (100 << 3), sol kaydırma operatörünün Python'da bir hatası var.


Hata yok, sadece sayı başına 8 bit ile sınırlı değil.
Oso

Hem << hem de >> operatörleri aynı mantıkla çalışmalıdır. Ancak << operatörü farklı davranıyor. Python ile sadece jow ile davranışsal bir hata bildirdim.
Nandish
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.