迭代C中的位

时间:2014-10-16 18:09:54

标签: c bit bitarray

我有一个很大的char * str,其中前8个字符(如果我没有错,则等于64位)代表一个位图。有没有办法迭代这8个字符,看看哪些位是0?我在理解位的概念方面遇到了很多麻烦,因为你无法在代码中“看到”它们,所以我想不出任何方法来做到这一点。

6 个答案:

答案 0 :(得分:8)

想象一下,你只有一个字节,一个字符my_char。您可以使用按位运算符和位移来测试各个位。

unsigned char my_char = 0xAA;
int what_bit_i_am_testing = 0;

while (what_bit_i_am_testing < 8) {
  if (my_char & 0x01) {
     printf("bit %d is 1\n", what_bit_i_am_testing);
  }
  else {
     printf("bit %d is 0\n", what_bit_i_am_testing);
  }

  what_bit_i_am_testing++;
  my_char = my_char >> 1;
}

必须是新手的部分是>>运算符。该操作符将“在左侧插入一个零并向右推动每一位,最右侧将被丢弃”。

对于1的正确位移,这不是一个非常技术性的描述。

答案 1 :(得分:3)

这是一种迭代无符号整数的每个设置位的方法(对于明确定义的行为使用无符号而不是有符号整数;任何宽度的无符号都应该没问题),一次一位。

定义以下宏:

#define LSBIT(X)                    ((X) & (-(X)))
#define CLEARLSBIT(X)               ((X) & ((X) - 1))

然后你可以使用下面的习惯用法迭代设置位,首先是LSbit:

unsigned temp_bits;
unsigned one_bit;

temp_bits = some_value;
for ( ; temp_bits; temp_bits = CLEARLSBIT(temp_bits) ) {
    one_bit = LSBIT(temp_bits);
    /* Do something with one_bit */
}

我不确定这是否符合您的需求。你说你要检查0位而不是1位 - 也许你可以按位反转初始值。同样对于多字节值,您可以将其放在另一个for循环中以一次处理一个字节。

答案 2 :(得分:2)

在C语言中,字符是8位宽字节,通常在计算机科学中,数据以字节为基本单位组织。

在某些情况下,例如您的问题,数据在各个位中存储为布尔值,因此我们需要一种方法来确定特定字节中的特定位是打开还是关闭。已经有一个SO解决方案来解释how to do bit manipulations in C

要检查一下,通常的方法是将它与要检查的位进行AND运算:

int isBitSet = bitmap & (1 << bit_position);

如果此操作后变量isBitSet为0,则不设置该位。任何其他值表示该位已打开。

答案 3 :(得分:2)

小端内存架构确实如此:

const int cBitmapSize = 8;
const int cBitsCount = cBitmapSize * 8;
const unsigned char cBitmap[cBitmapSize] = /* some data */;

for(int n = 0; n < cBitsCount; n++)
{
  unsigned char Mask = 1 << (n % 8);
  if(cBitmap[n / 8] & Mask)
  {
    // if n'th bit is 1...
  }
}

答案 4 :(得分:1)

对于一个字符b,您可以像这样迭代:

for (int i=0; i<8; i++) {
  printf("This is the %d-th bit : %d\n",i,(b>>i)&1);
}

然后,您可以根据需要迭代字符。

你应该理解的是,你不能直接操作这些位,你可以在基数2中使用数字的一些算术属性来计算以某种方式表示你想知道的某些位的数字。

它如何起作用?在char中有8位。 char可以看作是在基数2中用8位写入的数字。如果b中的数字是b7b6b5b4b3b2b1b0(每个都是数字),那么b>&gt; i被b向右移位i位置(在左边0和#中) 39; s被推了)。所以,10110111&gt;&gt; 2是00101101,然后操作&amp; 1隔离最后一位(按位和运算符)。

答案 5 :(得分:0)

如果要遍历所有字符。

FailedMount Failed to attach volume "pv0001" on node "xyz" with: googleapi: Error 400: The disk resource 'abc' is already being used by 'xyz'

输出

char *str = "MNO"; // M=01001101, N=01001110, O=01001111
int bit = 0;

for (int x = strlen(str)-1; x > -1; x--){ // Start from O, N, M
    
    printf("Char %c \n", str[x]);
 
    for(int y=0; y<8; y++){ // Iterate though every bit
    // Shift bit the the right with y step and mask last position
        if( str[x]>>y & 0b00000001 ){ 
            printf("bit %d = 1\n", bit);
        }else{
            printf("bit %d = 0\n", bit);
        }
        bit++;
    }
    
}