如何在C中给出一个字节的特定位?

时间:2014-02-25 04:43:30

标签: c binary byte bits

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

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

7 个答案:

答案 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
}