如何检查(按位?)值中是否只更改了值?

时间:2014-12-08 14:38:50

标签: bit

如何检查值与另一个(下一个)值之间是否只有1位变化?

输出例如是

001

101

110

在第二个输出中有一个0变为1

在第三个输出中有一个0变为1并且最后一个变为0

如果只有1次更改,程序可能会继续。

4 个答案:

答案 0 :(得分:1)

首先,对两个数字进行异或。对于每个改变的位,XOR将返回1。

示例:

0101110110100100

XOR

0100110110100100

会给你

00010000亿

现在您需要的是一种快速方法,可以检查结果数字中是否只有一位,或者换句话说,如果得到的数字是2的幂。

快速测试是:(x & (x - 1)) == 0

不需要循环。

答案 1 :(得分:0)

您可以计算按位XOR,然后只计算1的位。这被称为汉明距离。例如:

unsigned int a = 0b001;
unsigned int b = 0b100;
unsigned int res;
/* Stores the number of different bits */
unsigned int acc;

res = a ^ b;

/* from https://graphics.stanford.edu/~seander/bithacks.html */
for (acc = 0; res; res >>= 1)
{
  acc += res & 1;
}

答案 2 :(得分:0)

Java

void main(String[] args){
    boolean value = moreThanOneChanged("101", "001");
}

static boolean moreThanOneChanged(String input, String current){

    if(input.length() != current.length()) return false;

    char[] first = input.toCharArray();

    char[] second = current.toCharArray();

    for(int i = 0, j = 0; i < input.length(); i++){
        if(first[i] == second[i])
            j++;
        if(j > 1)
            return true;
    }

    return false;

}

答案 3 :(得分:0)

您可以使用每个值的andexclusive or之间的exclusive or minus 1比较,相当轻松地向自己证明。通过查看值和结果的二进制表示,可以更容易地查看发生的情况。函数onebitoff下方执行测试。其他函数只提供输出结果的方法:

#include <stdio.h>
#include <limits.h>   /* for CHAR_BIT */

#define WDSZ 64

/** returns pointer to binary representation of 'n' zero padded to 'sz'.
  *  returns pointer to string contianing binary representation of
  *  unsigned 64-bit (or less ) value zero padded to 'sz' digits.
  */
char *cpbin (unsigned long n, int sz) 
{
    static char s[WDSZ + 1] = {0};
    char *p = s + WDSZ;
    int i;

    for (i=0; i<sz; i++) {
        p--;
        *p = (n>>i & 1) ? '1' : '0';
    }

    return p;
}

/* return true if one-bit bitwise variance */
int onebitoff (unsigned int a, unsigned int b)
{
    return ((a ^ b) & ((a ^ b) - 1)) ? 0 : 1;
}

/* quick output of binary difference for 2 values */
void showdiff (unsigned int a, unsigned int b)
{
    if (onebitoff (a, b))
        printf ( " values %u, %u - vary by one-bit (bitwise)\n\n", a, b);
    else 
        printf ( " values %u, %u - vary by other than one-bit (bitwise)\n\n", a, b);

    printf ("  %3u : %s\n", a, cpbin (a, sizeof (char) * CHAR_BIT));
    printf ("  %3u : %s\n", b, cpbin (b, sizeof (char) * CHAR_BIT));
    printf ("  xor : %s\n\n",  cpbin ((a ^ b), sizeof (char) * CHAR_BIT));
}

int main () {

    printf ("\nTest whether the following numbers vary by a single bit (bitwise)\n\n");

    showdiff (1, 5);
    showdiff (5, 6);
    showdiff (6, 1);
    showdiff (97, 105);  /* just as a further test */

    return 0;
}

<强>输出:

$ ./bin/bitsvary

Test whether the following numbers vary by a single bit (bitwise)

 values 1, 5 - vary by one-bit (bitwise)

    1 : 00000001
    5 : 00000101
  xor : 00000100

 values 5, 6 - vary by other than one-bit (bitwise)

    5 : 00000101
    6 : 00000110
  xor : 00000011

 values 6, 1 - vary by other than one-bit (bitwise)

    6 : 00000110
    1 : 00000001
  xor : 00000111

 values 97, 105 - vary by one-bit (bitwise)

   97 : 01100001
  105 : 01101001
  xor : 00001000