2009-11-29 12 views
5

C, Bir adresi temsil eden 32 bitlik bir sözcüğe sahibim (ve imzasız uzun bir süre saklıyorum, umarım sorun değil). Şimdi topladığımdan, bir adresin bir kısmı sayfa numarasını, diğer kısmı ise ofseti içeriyor. Bana sadece sayfa numarasını veren bitleri nasıl çıkarabileceğimi merak ediyordum. Zaten ilk 22 en önemli bit çalıştı, sayfa numarası ve diğer 10 bit, sayfa ofset. Sadece sayfa numarası olan bitleri nasıl alabilirim? Bunu biraz bitkin operasyonlarla yapabileceğimi düşünüyorum, ama nasıl emin değilim.Ayıklama bitleri

+0

İyi bir soru - Bunu bir dezavantaj için yapmalıyım. – new123456

cevap

11

Gereksinim duyduğunuz bitleri ayıklamak için bitshift işleçlerini kullanın. sayfa numarası için

pageNumber = x >> 10; 
offset = x & ((1 << 10) - 1); 

, >> operatör aşağı bitleri kaydırır, bu nedenle en az signifcant bitlerini kaybederler.

Ofset için, ((1 < < 10) - 1), yalnızca en az önemli bitleri seçmek ve en anlamlı bitleri yok saymak için kullanılan 10 taneden oluşan bir bit maskesi oluşturur.

+1

Donanımınız aritmetik (işaret genişletme) sağa kaydırma yaptığında, bunları kaydırdıktan sonra bitlerin maskelenmesi bu gibi bir kod hakkında iyi bir fikir olabilir. pagenum = (x >> 10) & ((1 << 22) - 1); –

2

"İki vardiya" alan çıkarma yönteminin büyük bir hayranıyım. Hem imzalanmış hem de imzasız çalışır. word den en az önemli bit lsb ile genişlik w tarlası ayıklamak için:

#define BITSIN(W) (8*sizeof(W)) 
return (word << (BITSIN(word) - (lsb+width))) >> (BITSIN(word) - width); 
Bu durumda

, BITSIN(word) == 32 ve lsb+width == 32, bu yüzden sürece, söz konusu kelime imzasız olduğu gibi, sadece maskeleme olmadan doğru 10 kayabilir.

Bir uyarı: 32 bit türlerde 32 bit değişikliklere dikkat edin! C standardı, derleyicinin herhangi bir şey yapmasına izin verir ve ortak Intel yongalarının ne işe yaradığını görür: x << yx kaymaları y % 32 bitten ayrılır (x, 32 bitlik bir tamsayı türüne sahiptir). Bu 32 bitlik bir tamsayı sola veya sağa 32 bit kaydırmaya çalıştığınızda, sonuç no-op ile aynıdır. 64-bit türlerin 64-bit vardiyaları ile benzer bir sorun var.

+0

"Genel Intel yongalarının ne işe yaramadığını" - ne yaparlar? – AShelly

+0

@ASHelly: iyi soru; Cevabı ben düzenledim. Kim bilir, bu bana bir vahim olabilir :-) –