2013-04-07 9 views
12

İşaretçilerdeki bit maskeleri yapamayacağınızı okudum, nasıl işaretçilerde bit yapamazsınız?Neden C işaretçisinde bitsel işlemleri yapamıyorsunuz ve bunun bir yolu var mı?

Aynı efekti elde etmenin herhangi bir yolu var mı?

Aynı şey C++ için de geçerlidir?

+0

Bunun için kullanım durumunuzu merak ediyorum. Detaylandırır mısın? –

+3

Ne "etkisi" elde etmeye çalışıyorsun? İşaretçilerdeki bit işlemleri gerçekten mantıklı değil. –

+0

Büyük olasılıkla hizalanmış tahsis, çalışma zamanı genellikle sizin için mekaniği sağladığından beri artık gerçekten gerekmiyor. – WhozCraig

cevap

14

Biten işaretleme işlemlerini yapamayacağınız nedeni, standardın yapamayacağınız anlamına gelmesidir. Standartın neden böyle yazıldığını düşünürüm, çünkü bitsel işaretçi işlemleri neredeyse evrensel olarak tanımlanmamış veya (en iyi) uygulama tanımlı davranışa neden olur. Yani, kullanışlı ve taşınabilir, ekleyebileceğiniz hiçbir şey olmayacak, ek olarak daha basit işlemlerin aksine.

Ama döküm ile etrafında alabilirsiniz:

#include <stdint.h> 

void *ptr1; 
// Find page start 
void *ptr2 = (void *) ((uintptr_t) ptr1 & ~(uintptr_t) 0xfff) 

C++ gelince, sadece yerine C tarzı atmalarını ait reinterpret_cast kullanın.

+1

Aslında oldukça sinir bozucu. C, işletim sistemi ve gömülü sistemi "yüksek düzeyde" yıllardır tercih edilen bir dil olarak bilinir - temel düzeyde temelde taşınabilir olmayan her iki geliştirme türü de, şimdi en uygun rolünü benimsemeyi reddeder.Neyse ki c99 sonunda tamsayıların birçoğunu tanır, bellek yönetim kodunun neden her bir değişkeni birden çok kez basit bir maske operasyonu yapmak zorunda bıraktığının bir sebebi yoktur. – duanev

5

Anlambilim çok iyi tanımlanmadığı için izin verilmiyor. Yine de bunu yapabilirsin. Sadece uintptr_t'a dökün, işlemleri yapın ve sonra bir işaretçi türüne geri dönün. Bu da C++ içinde çalışacak.

4

İşaretçilerdeki bitlikli operatörleri kullanamazsınız; çünkü standartlar, bir işaretçinin nasıl temsil edildiğine ve belirli bir göstergenin hangi adres aralığına hitap edebileceğine dair çok az gereksinim gerektirir. Dolayısıyla, bu işleçleri bir işaretçi üzerinde kullanmanın ne anlama geleceğinin bir tanımı yoktur. Bununla birlikte, çoğu makinedeki çoğu derleyici, bellek adresinin işaretçinin değeri olarak açıkça haritalanmasını kullanır. Ve bunların çoğu, ayrılmaz bir türe işaretçi bırakmanıza izin verecek. Daha sonra, değer üzerinde bitsel işlemleri yapabilir ve hatta bir işaretçiye geri gönderebilirsiniz. Ancak bu, kesinlikle taşınabilir veya genel olarak iyi tanımlanmayacaktır.

İlgili konular