2016-03-19 24 views
-2

C'de bir bellek yöneticisi yazıyorum ve düzgün şekilde hizalandığından emin olmaya çalışıyorum (kullanıcı alanının 8 ile bölünebilen bir adreste başladığından emin olun ve tüm bloğun bölünebilir olduğundan emin olun. 8 de).Bitsel veya operatör | bellek bloklarını hizalamak için C içinde kullanım

merak ediyorum herkes bunu yapar söyle eğer: Bir arkadaş tarafından bana önerildi bir kod parçası var

x = ((x - 1) | 7) + 1; 

ama ne dikey çubuk en/o ne yaptığını emin değilim işlevi bu senaryoda

Düzenleme: Bunu biraz daha açıklayabileceğimi fark ettim; x bir int, ve ben bir bitlik OR operatör olduğunu baktım, ama bu bağlamda ne anlama geldiğini anlamadım. Yardım için teşekkürler!

+3

Stackoverflow, dil temellerini öğrenmek için en iyi yer değildir. Temel bir C eğitim veya kitabına danışın. Özel olarak questisn gelince, '|' [bitiwise VEYA operatörü] şeklindedir (https://en.wikipedia.org/wiki/Bitwise_operations_in_C). – kaylum

+0

Neden arkadaşına sormadın? –

+1

Bu yanlış görünüyor. En azından 'int' değerlerini kullanmak kötü bir fikirdir. Bu gerçekten "dil temelleri" ve nasıl doğru bellek hizalamak veya bunu yapmak için bir ifade anlamak için ifade yazmak olduğunu düşünmüyorum – Olaf

cevap

2

8 ile bölünebilir bir numara yapmak için standart bir yoludur: arkadaşınızın yapı daha anlamak daha kolay olacaktır (BTW muhtemelen de çalışır, ancak aşağıya bakınız) gerekir

len = (len + 7) & 0xfffffff8; /* for positive 32-bit values */ 

.

Yaptığınız yapı bit sayısının alt bitlerini bit olarak ayarlar. 7 ile böler (böylece 8 ile bölündüğünde 7'ye kalanı olan bir sayı oluşturur), sonra bunu 8 ile bölünebilir hale getirmek için 1 ekler. Ne -1 anlamı, kendi başına çalışmalısın. Ona bakmazdım, ilk bakışta ne yaptığını anlamazsan onu kullanmazdım.

İmzalı tamsayıların adres ve blok uzunlukları olarak kullanılması önerilip önerilmeyeceği kesinlikle başka yorumlarda bulunacaktır.

0

Bu ifade aynen böyle bir if deyimi içinde:

if (x % 8 != 0): 
    x = ((x - 1) | 7) + 1; 

Sadece başlangıçta kod parçasını daha ekledik gerektiğini, bunun için özür. "| 7" Ben ikili matematik gözden kez biraz, bunu kabul bu x yanlış hizalanmış olduğu düşünülen olduğunda kullanılan bir ifadedir anlamına YA 0111 ile ve verilen sadece olabilir sonuçları aşağıdaki gibidir:

(x-1) < ise 7: ((x-1) | 7) 0111'dir. Ekleme 1, durumu karşılayan 8 verir.

15> (x-1)> 7 ise: ((x-1) | 7) 1111 1 Ekleme yine çok daha yüksek değerler için

ve tatmin, 16 verir. önerileriniz herkes için

sayesinde bu benim ilk soruydu, gelecekte bunları geliştirmek için emin olacağım!

İlgili konular