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
cevap
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.
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); –
"İ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 << y
x
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.
"Genel Intel yongalarının ne işe yaramadığını" - ne yaparlar? – AShelly
@ASHelly: iyi soru; Cevabı ben düzenledim. Kim bilir, bu bana bir vahim olabilir :-) –
- 1. BitArray - Shift bitleri
- 2. Belirli bitleri R?
- 3. C# içindeki bir dizeden bitleri nasıl alabilirim?
- 4. Delphi: TBitlerden X bitleri nasıl okunur?
- 5. C# 'den uzun bir süre için kopya bitleri C#
- 6. Kayan nokta çarpımı için MIPS'de bitleri aşağı kaydır
- 7. Firefox'taki hata ayıklama hata ayıklama
- 8. Raylar ayıklama
- 9. Hata ayıklama üzerinde uygulama, hata ayıklama sırasında değil
- 10. Eclipse kısayolu "hata ayıklama son hata ayıklama yapılandırması" (F11 değil)
- 11. Eclipse Java Hata ayıklama dosyaları ile hata ayıklama
- 12. piton ayıklama seçeneği hata ayıklama modunda isem bir komut
- 13. ASP.Net Core, bir hata ayıklayıcıda hata ayıklama değil hata ayıklama
- 14. Hata ayıklama, sürüm
- 15. Hata ayıklama Ember.js'den chrome
- 16. Win32 Hata Ayıklama Makroları
- 17. .Fla dosyasından ayıklama ActionScript
- 18. SPSS dize ayıklama
- 19. Hata ayıklama Java yöntemi
- 20. Xcode C++ hata ayıklama
- 21. Standart hataları ayıklama glm
- 22. Hata ayıklama döngüleri
- 23. Hata ayıklama 403'ler?
- 24. Hata ayıklama metaprogramları
- 25. Hata ayıklama outofmemoryexception
- 26. ASP.NET'te hata ayıklama ASP.NET
- 27. ayıklama seg arıza :: libpcl_surface
- 28. Bahar ayıklama bilgi Örneğin
- 29. Hata ayıklama getResource *
- 30. PyCharm JavaScript Hata ayıklama
İyi bir soru - Bunu bir dezavantaj için yapmalıyım. – new123456