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