使用按位运算符获取C中的位值

时间:2018-02-18 16:32:09

标签: c bitwise-operators

我在C中编写一个程序,我在比较两个字节的数据,然后查看字节是否不同,如果是,那么在哪些位。

这是我到目前为止所做的:

int var1 = 81;  //Binary: 0101 0001
int var2 = 193; //Binary: 1100 0001
int diff = var1 ^ var2; //diff = 1001 0000 / 144

基本上我知道如何使用XOR按位运算符来查看两个变量之间的哪些位不同,但是从这里我不知道如何使用diff来确定哪些位是差异。例如,在上面的代码中,我想使用diff来输出" Bit 5和Bit 8是不同的"。

4 个答案:

答案 0 :(得分:3)

您可以使用for loop来获取该想法,并使AND按位1正确左移以获取设置位位置

for(size_t i = 0; i < sizeof(int)*8; i++){
  if( diff & (1U << i))
    printf("%zu is different\n",i+1);
}

答案 1 :(得分:2)

在进行位操作时,使用unsigned类型开始会容易得多。

由于@coderredoc询问了各种平台上的解决方案,甚至是不常见的解决方案:

使用int

int diff为否定时,转换为unsigned(通过使用unsigned屏蔽)可能会change其位模式。

int每个&#34;字节&#34;可能超过8位。减少sizeof(int)*8的正确性。

各种整数类型可能有填充(罕见)。减少sizeof(int)*CHAR_BIT的正确性。

// OP wants to report first bit index as 1.  0 is more common.
#define BIT_REPORT_OFFSET 0

int bit_position = 0;
int mask;
do {
  mask = 1 << bit_position;
  if (diff & mask) {
    printf("Bit %d\n", bit_position + BIT_REPORT_OFFSET);
  }
  bit_position++;
} while (mask < INT_MAX/2);

if (diff < 0) {
  printf("Bit %d\n", bit_position + BIT_REPORT_OFFSET);
}

为了获得最大的可移植性,请避免更改类型,更改diff的值并使用<limits.h>中的常量而不是计算它们。

答案 2 :(得分:0)

要获得different bits位置,请假设您有4 byte整数

for(int bit_index  = sizeof(diff) - 1; bit_index >= 0;bit_index-- ) {
 if((diff >> bit_index & 1) == 1 ){ /* if particular bit is 1, that bit_index value you can use */ 
  printf("[%d] bit is different or 1 \n",bit_index);
}

答案 3 :(得分:0)

使用unsigned int代替int;然后你可以使用

for (unsigned int pos = 0; diff; ++pos) {
     if (diff & 1)
         printf("difference in pos %u\n", pos);
     diff >>= 1;
}

while (diff) {
    int pos = ffs(diff);
    printf("difference in pos %d\n", pos);

    diff &= ~(1u << pos);
}