例如,假设我有类似“0000 0000 0000 1110”的内容。
如何访问最左边的1并将其更改为0?
答案 0 :(得分:3)
这两个函数可以处理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 :(得分:1)
使用按位和(&amp;)。像0000 0000 0000 1110&amp; 0000 0000 0000 1000将给出非零答案
答案 2 :(得分:0)
我认为您正在寻找 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;
}
答案 3 :(得分:0)
我假设你的输入是32位。我们扫描输入的第一个1,左移;将&
更改为0X7FFF
,将第一位更改为0,右移我们左移的数字+ 1。
unsigned int i = 0XE;
int j;
for ( j = 0; j < 32 && ! ( i & 0X8000 ); j++ )
i <<= 1;
i &= 0X7FFF;
i >>= ( j + 1 );
答案 4 :(得分:0)
假设a = 0000 0000 0000 1110
int i =16 ;
b = 1;
while(true)
{
b = b << 1 ;
if(b & 0x1000000000000000)
{
break;
}
i = i +1 ;
}
你可以像这样访问玩具
int yourbit= ~0; /* All 1’s */
youtbit = (max >> (i+1) ) + 1
答案 5 :(得分:0)
我认为你提到右手边的第四位是最左边的位。
要访问特定位,您可以使用Shift Operators
。
如果您要重置1
,那么您可以使用&
操作。
但是,如果它也可以采用0
值,则&
操作将失败为0 & 1 = 0
。您可以在此期间使用| (OR)
。
将此值存储在变量中,并使用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
希望它有所帮助。
答案 6 :(得分:0)
#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
}