如何在C中访问给定字节的特定位?

如何在C中访问给定字节的特定位?,c,binary,byte,bits,C,Binary,Byte,Bits,例如,假设我有类似“0000 0000 1110”的内容 如何访问最左边的1并将其更改为0?我想您正在寻找 例如: 00011001 >> 3 = 00000011 现在用1掩盖它 00000011 & 00000001 = 00000001 代码:- int funcBitMasking(int8_t mybyte, int firstbit) { if (firstbit> 0 && firstbit<= 16) r

例如,假设我有类似“0000 0000 1110”的内容


如何访问最左边的1并将其更改为0?

我想您正在寻找

例如:

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;
}
int funcBitMasking(int8\t mybyte,int firstbit)
{

如果(firstbit>0&&firstbit使用按位And(&)。例如0000 0000 1110&0000 0000 1000将给出非零答案

我假设您的输入是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 );
无符号整数i=0XE;
int j;
对于(j=0;j<32&&!(i&0X8000);j++)
i=(j+1);

假设a=0000 1110

int i =16 ;
 b = 1;
while(true)
{

  b = b << 1 ;
  if(b & 0x1000000000000000)
  {
   break;
  }
 i = i +1 ;
}

我想你提到的是右手边的第四个位子是最左边的位子

要访问特定位,可以使用
移位运算符

如果要重置的总是
1
,则可以使用
&
操作

但是,如果它也可以取
0
值,那么
&
操作将失败,因为
0&1=0
。在此期间,您可以使用
|(或)


将此值存储在变量中,并使用
(1执行
操作。这两个函数可以处理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;
    }
}
uint8获取位(uint64位,uint8位)
{
返回(位>>位置)&0x01;
}
uint64设置位(uint64位、uint8位、uint8位值)
{
uint64\u t掩码=1LL=0;i--)
{
if(获取位(v,i)){
v=设置位(v,i,0);
打破
}
}
#包括
#包括
int mlb_pos(uint16_t x){//0原点
uint16_t y;
int n=16;
如果(y!=0){n=n-8;x=y;}
如果(y!=0){n=n-4;x=y;}
如果(y!=0){n=n-2;x=y;}
y=x>>1;如果(y!=0){返回15-(n-2);}
返回15-(n-x);
}
int main(){
uint16\u t n=14;//0b0000000000001110

uint16_t result=n^(1一般来说,对于像这样的位旋转黑客,请查阅。一行代码以获取设置为1的msb:
i=floor(log(bits)/log(2))
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;
    }
}
#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
}