2
A
回答
8
兩種可能性:
- 你的表達被評估爲的整數且鑄造爲中端SNGLE字節值。
- 編譯器優化了轉換操作。
請注意,您的結果應該是5,不3.你想要的是:
const unsigned char c = 253 & 0x07 ; // (00000111)
你的位掩碼是:
253 | 1 1 1 1 1 1 0 1 | F D
7 | 0 0 0 0 0 1 1 1 | 0 7
+++++++++++++++++++++++++++
5 | 0 0 0 0 0 1 0 1 | 0 5
1
由於整數推廣。表達式253 << 5
中沒有任何內容限制它僅在一個字節中工作;文字253
的類型是int
。
你需要添加演員,或者(更好,在我看來)使用掩碼提取。從一個整數得到的最低三個位,只需使用:
const unsigned char r = 253 & ~((1 << 3) - 1);
此操作,因爲1 < < 3是8 ,這在二進制是00001000 。我們減去一個,得到7 或00000111 。我們反轉這個,得到一個包含除最右邊三位之外的所有內容的掩碼,即11111000 。然後這個值與按值進行逐位提取。
上面我只用8位顯示了二進制數值,在左邊用零延伸直到您的平臺的尺寸爲int
,因爲以上是使用int
精度完成的。
3
使用整數評估你的表達。將其更改爲:
unsigned char r = ((unsigned char)(253 << 5) >> 5);
並且您應該獲得所需的結果。
相關問題
- 1. 乘用算法Bitshifts
- 2. C標準和bitshifts
- 3. Bitshifts抵消,而不是預期的行爲
- 4. lodash合併,合併對象
- 5. PHP數組合並/合併
- 6. rownames合併或合併
- 7. SVN - 合併不合並
- 8. git合併不合並
- 9. GitHub - 合併請求 - 合併
- 10. Automapper合併/合併映射
- 11. 合併數組併合並這些值
- 12. Git的合併合併後,並恢復
- 13. Spring集合合併
- 14. 合併/聚合disqus
- 15. Propel - 合併集合
- 16. XSLT組合/合併
- 17. 組合和合並
- 18. 合併
- 19. 合併,並在Python
- 20. 合併排序中的合併部分
- 21. Git在合併之前合併提交
- 22. Git - 處理文件合併的合併
- 23. Subversion合併未合併文件
- 24. 合併,cbind:如何合併更好?
- 25. 熊貓合併vs R合併
- 26. 合併和合並Join任務
- 27. 如何取消合併(稍後合併)
- 28. 「沒有合併」與汞合併
- 29. 汞合併 - >還原 - >合併
- 30. 合併/合併兩個對象
爲什麼不使用一個位掩碼去掉你的情況下的3個LSB - 00000111b? – StuartLC 2011-02-14 13:46:27