在C中, 我有一個32位字代表一個地址(我有它存儲在一個無符號長,希望沒關係)。現在從我收集的內容中,地址的一部分包含頁碼,另一部分包含偏移量。我想知道如何才能提取給我頁碼的位。我已經計算出前22位最重要的位是頁碼,其他10位是頁偏移量。我怎樣才能抓取頁碼的位?我想我可以用一些按位操作來做到這一點,但我不知道如何。提取位
提取位
回答
使用bitshift運算符來提取所需的位。
pageNumber = x >> 10;
offset = x & ((1 << 10) - 1);
對於頁碼,>>操作符會將位向下移位,因此您會丟失最不重要的位。對於偏移量,((1 < < 10)-1)創建一個由10個位組成的位掩碼,其用於僅選擇10個最低有效位並忽略最高有效位。
這樣的代碼可能是一個好主意,在你移動它們之後屏蔽這些位,以防硬件進行算術(符號擴展)右移。 pagenumber =(x >> 10)&((1 << 22) - 1); – 2009-12-04 03:36:43
我是現場提取「兩班倒」方法的狂熱粉絲。它既可以簽名也可以不簽名。爲了從word
提取的寬度w
與至少顯著位lsb
場:
#define BITSIN(W) (8*sizeof(W))
return (word << (BITSIN(word) - (lsb+width))) >> (BITSIN(word) - width);
在這種情況下,BITSIN(word) == 32
和lsb+width == 32
,所以只要有問題的話是無符號,你可以右移10毫無遮攔。
一個注意事項:要注意32位類型的32位移位! C標準可以讓編譯器做任何事情,而普通的Intel芯片所做的並不是有用的:x << y
移位x
左邊的y % 32
位(假設x
有32位整數類型)。這意味着如果您嘗試將32位整數左移或右移32位,則結果與無操作相同。 64位類型的64位移位存在類似的問題。
「英特爾普通芯片所做的一切沒有用處」 - 他們做了什麼? – AShelly 2009-12-03 19:31:56
@ashelly:很好的問題;我編輯了答案。誰知道,它可能會讓我讚不絕口:-) – 2009-12-04 02:59:10
- 1. 從TOleContainer中提取位圖?
- 2. 提取8位數字
- 3. 從緩衝區中提取位
- 4. 關於:提取區域從位圖
- 5. 位置細胞並提取數值
- 6. 以數字位置提取整數Swift
- 7. 從PDF中提取文本位置
- 8. 重命名提取文件的位置
- 9. 解析XML提取定位參數
- 10. 在Ruby整數中提取位
- 11. C/Unix:如何從st_mode中提取位?
- 12. 從NSColor中提取32位RGBA值
- 13. MATLAB:提取最重要的位
- 14. 提取像素的最低有效位
- 15. 提取4位數字 - 錯誤信息
- 16. 如何提取使用到位桶-API
- 17. 從照片中提取位置信息
- 18. 相對定位文本提取失敗
- 19. 如何提取10位數字excel列
- 20. 關於Android中的融合位置提供者獲取位置
- 21. 使用熔合位置提供程序獲取位置
- 22. 從Python中的位串流中提取位
- 23. 從bam文件中提取讀取位置
- 24. 提取子集提取
- 25. Android獲取位置或提示以啓用位置服務,如果禁用
- 26. 提取小數點後的10位數,並應用舍入到3個位置
- 27. 與形式獲取用戶位置使用HTML5地理位置提交
- 28. 從TXT文件中提取從位置X到位置Y的字符串
- 29. /提取
- 30. 提取
好問題 - 我需要爲我編寫的反彙編程序做這件事。 – new123456 2011-07-16 20:33:14