回答
這兩個函數可以處理64位值。
uint8_t get_bit(uint64_t bits, uint8_t pos)
{
return (bits >> pos) & 0x01;
}
uint64_t set_bit(uint64_t bits, uint8_t pos, uint8_t value)
{
uint64_t mask = 1LL << (63 - pos);
if (value)
bits |= mask;
else
bits &= ~mask;
return bits;
}
uint64_t v = ...;
uint8_t i = 63;
for(;i>=0; i--)
{
if(get_bit(v, i)){
v=set_bit(v,i, 0);
break;
}
}
單線程得到設置爲1的msb:'i = floor(log(bits)/ log(2))' –
我認爲你正在尋找bit masking
例如:
00011001 >> 3 = 00000011
現在用1
00000011 & 00000001 = 00000001
碼掩碼是: -
int funcBitMasking(int8_t mybyte, int firstbit)
{
if (firstbit> 0 && firstbit<= 16)
return (mybyte & (1<<(firstbit-1)));
else
return 0;
}
使用按位和(&)。像0000 0000 0000 1110 & 0000 0000 0000 1000將給出非零答案
我假設你的輸入是32位。我們掃描輸入的第一個,左移;通過&
改變的第一個位0與0X7FFF
和數量右移我們左移荷蘭國際集團它+ 1
unsigned int i = 0XE;
int j;
for (j = 0; j < 32 && ! (i & 0X8000); j++)
i <<= 1;
i &= 0X7FFF;
i >>= (j + 1);
假設= 0000 0000 0000 1110
int i =16 ;
b = 1;
while(true)
{
b = b << 1 ;
if(b & 0x1000000000000000)
{
break;
}
i = i +1 ;
}
,你將有存取權限toyour有點像這樣
int yourbit= ~0; /* All 1’s */
youtbit = (max >> (i+1)) + 1
我覺得你提到右邊的第四位是最左邊的位。可以使用Shift Operators
。
如果始終是要重置的1
,則可以使用&
操作。
但是,如果還可以取0
的值,那麼&
操作將失敗爲0 & 1 = 0
。在此期間您可以使用| (OR)
。
將該值存儲在一個變量中並使用(1 << 4)
操作 Shift運算符的右側將從右側開始位的位置。並且,Shift運算符的左側將會將該值放置在該位置上。操作員指向方向,值必須移位。
請參考以下鏈接,瞭解更多信息。
http://www.eskimo.com/~scs/cclass/int/sx4ab.html
http://www.codeproject.com/Articles/2247/An-introduction-to-bitwise-operators
希望它幫助。
#include <stdio.h>
#include <stdint.h>
int mlb_pos(uint16_t x) {//0 origin
uint16_t y;
int n = 16;
y = x >> 8; if (y != 0){ n = n - 8 ; x = y; }
y = x >> 4; if (y != 0){ n = n - 4 ; x = y; }
y = x >> 2; if (y != 0){ n = n - 2 ; x = y; }
y = x >> 1; if (y != 0){ return 15-(n-2); }
return 15-(n-x);
}
int main(){
uint16_t n = 14;//0b0000000000001110
uint16_t result = n^(1<<mlb_pos(n));
printf("%d\n", result);//6 : 0b0000000000000110
}
- 1. 如何翻轉C中某個字節的特定位?
- 2. 訪問收件箱,給定一個特定的日期
- 3. 如何獲得特定的JTree節點給定一個字符串數組
- 4. 如何訪問字典中的特定鍵/值C#
- 5. 訪問JSON的節點j中的特定位置
- 6. Verilog訪問特定位
- 7. 如何從特定的ThingSpeak字段訪問值(一個數組)?
- 8. 如何訪問這個特定的類?
- 9. 定義可訪問位結合,半字節,字節
- 10. C#刪除特定字節
- 11. 在字節中設置特定位
- 12. 問題與特定的名字中選擇一個節點時
- 13. 如何訪問Twig(Symfony)中特定節點的XML屬性?
- 14. 如何訪問節點對象中的特定屬性值?
- 15. 如何迭代一系列位或訪問NASM程序集中的特定位?
- 16. 訪問特定節點的JSON
- 17. 如何在一個字節數組覆蓋一個特定塊
- 18. C++ ifstream.read;讀取字節少於給定的n個字節
- 19. 如何訪問位圖圖像中的每個字節
- 20. 從Objective-C的特定位置讀取字節的特定長度
- 21. 如何在Python中訪問整數列表的特定位置?
- 22. 使用C#在SQL Server中從dbContext訪問給定表的給定字段
- 23. 如何使用XSLT定位xml文檔中的特定節點?
- 24. 如何在C中訪問數組中的特定結構?
- 25. 如何訪問一個特定的XmlNode的的innerText
- 26. 設置/鑄造一組中的特定位或字節
- 27. 如何從C#中的XML字符串獲取特定節點
- 28. 給予另一個類訪問特定方法
- 29. API查找企業名稱,給定一個特定的位置?
- 30. 如何查找給定字符串中的特定字符?
通常,對於像這樣的位變換黑客,諮詢[位操作黑客](http://graphics.stanford.edu/~seander/bithacks.html)。 –