Bitsel Operatörler - Binary Sayının 2'ye Tümleyenini Alma

Selamun Aleyküm arkadaşlar.

İki binary sayı ile çıkarma işlemi yapmanın şöyle bir yolu var, ilk sayıyı aynen alıyoruz, 2. sayının ise 2’ye göre tümleyenini alıp ilk sayı ile topluyoruz. Böylece çıkarma işlemi yapmış oluyoruz.

İkiye göre tümleyen şöyle alınıyor; önce binary sayının 1’e göre tümleyeni alınıyor (1’leri 0, 0’ları 1 yapılıyor), ardından bu sayıya 1 ekleniyor.

Örnek: 1101 sayısının 2’ye göre tümleyenini alalım.

  • Önce 1’e göre tümleyenini alalım, 1101 -> 0010
  • Ardından 1 ekleyelim, 0010 +1 = 0011

1101 sayısının 2’ye göre tümleyeni 0011 imiş.

Amacım python’da ikilik bir sayının 2’ye göre tümleyenini aldıktan sonra başka bir ikilik sayı ile toplayarak çıkarma işlemi yapmak. Kafam durdu resmen. Bitsel operatörlere baktım, (~) operatörü binary sayının tersini alıyormuş, fakat komut penceresi üzerinde yaptığım denemelerde arzu ettiğim çıktıyı göremiyorum.
Şöyleki;

x = 0b10110     # x'in değeri: 22 (decimal)
y = ~x
print(bin(y))

Çıktı: -0b10111 # y'nin değeri: -23 (decimal)

Bu adreste (~) operatörünün bitleri ters çevireceği yazıyor. Ben mi yanlış yapıyorum? Gözümden kaçan bir yer mi var anlamadım. Müsait olan bakabilirse sevinirim, teşekkürler…

1 Beğeni

Aleyküm Selam, Python’daki tam sayılar signed yani işaretli sayılar olduklarından bitwise operatörler beklenilen sonucu vermeyebiliyor (neden signed sayılara bitwise operatör uygulamamalıyız).

Beklenilenden kasıt "1’s complement"e göre düşünmek yani 0’ların 1, 1’lerin ise direkt 0’a dönüşmesi. Ancak 2’s complement’te durum farklı: https://en.wikipedia.org/wiki/Bitwise_operation#NOT

Python’da x signed bir tamsayı olduğunda ~x işleminin döndürdüğü sayı -(x+1) oluyormuş 2’s complement temsilinden dolayı. Aşağıda görüyoruz bunu:

İstediğiniz ters çevirme işlemini yapmak için ise bu davranıştan yola çıkarak kendiniz bir yöntem bulabilirsiniz, bakmak isterseniz bir yol şurada var https://stackoverflow.com/a/31151236/9332187

7 Beğeni