C语言中的位与函数

C语言中的位与函数,c,C,我想对整数进行按位AND计算,但不将它们转换为二进制数。例如,我有一个整数10111,它是整数,不是二进制的,还有一个整数01001。我需要这些数字的按位AND运算,而不需要将它们转换成二进制,然后进行按位AND运算。我知道我的要求不是按位的,但我想要类似的东西。我知道它最初可以解释为二进制,转换为十进制,然后按位和,但我不希望这样。我想要这样的东西: int a; int b; int temp; double result; temp = a & b; while (result

我想对整数进行按位AND计算,但不将它们转换为二进制数。例如,我有一个整数10111,它是整数,不是二进制的,还有一个整数01001。我需要这些数字的按位AND运算,而不需要将它们转换成二进制,然后进行按位AND运算。我知道我的要求不是按位的,但我想要类似的东西。我知道它最初可以解释为二进制,转换为十进制,然后按位和,但我不希望这样。我想要这样的东西:

int a;
int b;
int temp;
double result;

temp = a & b;

while (result != 0) {
        if (result % 10 == 1)
            count++;
        result /= 10;
    }

int length = floor(log10(abs(a))) + 1;
result = count / length;
return result;
我想用这个来检查自然语言处理中单词包的相似性,0和1的字符串。我正在导入Monetdb中的单词包,列类型应该是整数而不是字符串。例如,如果整数类型的单元格中有10111和01001,我希望得到00001和分数1/5,因为只有1个位置匹配

提前谢谢

int a, b;
int tmp = a & b;
int res = 0;

while ((tmp != 0 &&) (tmp / 10 != 0)){
    int dig = tmp % 10;
    res = (dig == 1)? ++res: res;
    tmp /= 10;       
}

试试这个。

可能有点笨重,但它可以工作,你可以自己优化它。我希望我能正确地理解你

输出:

10110和10011=10010

10110或10011=10111

问题是and只对位起作用,它不关心输入数字是以小数、八进制、十六进制还是其他方式给出的。要强制并正确工作,您必须以“二进制”形式为其输入,即只有1和0。要做到这一点,您需要抓取输入数字的每个数字,就像它们是二进制数字一样

以下工作如预期:

#include <stdio.h>

int cheap_pow (int base, int exponent)
{
    int result = base;
    while (exponent-- > 0)
        result *= base;
    return result;
}

int main (void)
{
    int a = 10111, b = 1001 ;
    int result, factor;

    printf ("BAD:  %05d AND %05d = %05d\n", a, b, a & b);

    printf ("GOOD: %05d AND %05d = ");

    result = 0;
    factor = 1;
    while (a | b)
    {
        result += factor * ((a & 1) and (b & 1));
        factor *= 10;
        a /= 10;
        b /= 10;
    }
    printf ("%05d\n", result);
}
但在定义输入时必须小心。当直接写入源代码时,值b=01001将被C编译器解释为八进制8,而不是十进制;它将具有十进制值513。这只是C的规则

如果您的输入来自其他地方,则不需要考虑这一点,除非您使用标准函数(如strtol),在该函数中,您应该小心,因为它会做同样的事情:

如果基数为零或16,则字符串可能包含0x 前缀,数字将以16为基数读取;否则,一个零 除非中的下一个字符为“0”,否则基数取10位小数 在这种情况下,它被视为8八进制


另一个注意事项是,该程序仅在有符号整数的范围内工作,即当前最多10个二进制数字。如果您需要更多,您可以切换到更大的类型;但除此之外,最好使用非数值解,并始终使用字符串。

整数是二进制数。这些数字在内存中以二进制形式表示。没有可转换的内容。使用位and运算符有什么问题?请澄清:您想将十进制数10111和01001与之相加,然后得到一个十进制结果,就像它们表示二进制一样?顺便说一句,要小心,因为符号01001可能会被误解为八进制。这就是应该发生的事情。计算机中的数字本质上是二进制的,因此,如果不将数字转换为二进制,您就无法处理这些数字。请编辑您的问题,以包括输入和输出示例。然后有人可能会明白你的意思。我认为这正是他想要的更好,而古怪循环的测试是a&&b。如果其中一个为零,您就完成了,对吗?@freeinkname谢谢您的回答。此代码的唯一问题是0&0不是1。但除此之外,我将尝试将其改编为Monetdb。@TomKarzes,没错。谢谢你的邀请suggestion@Masyaf不客气:不过我不明白你评论的第二部分。我刚刚运行了a=0,b=0的代码,结果是and和or都是0。
#include <stdio.h>

int cheap_pow (int base, int exponent)
{
    int result = base;
    while (exponent-- > 0)
        result *= base;
    return result;
}

int main (void)
{
    int a = 10111, b = 1001 ;
    int result, factor;

    printf ("BAD:  %05d AND %05d = %05d\n", a, b, a & b);

    printf ("GOOD: %05d AND %05d = ");

    result = 0;
    factor = 1;
    while (a | b)
    {
        result += factor * ((a & 1) and (b & 1));
        factor *= 10;
        a /= 10;
        b /= 10;
    }
    printf ("%05d\n", result);
}