我在C中有一个赋值,它只打印128到255之间的特定种类的数字(所以8位二进制表示),我应该不使用任何算术运算符。条件是:
我正在使用功能实现,并为这两个条件使用了单个函数,代码的一部分是:
int checkOneToZero(unsigned int num) {
unsigned int carry = 7,
counterOne = 0,
counterZero = 0,
ct = 0;
while ((carry > 0) || (carry == 0)) {
if ((num >> carry) & 1) {
counterOne = binaryAddition(counterOne, 1);
ct ++;
printf(" %d ", ct);
}
else {
counterZero = binaryAddition(counterZero, 1);
ct ++;
printf(" %d ", ct);
}
carry = binarySubtraction(carry, 1);
printf(" CARRY %d \n", carry);
if (counterZero > counterOne) {
printf(" breakCounterZero %d breakCounterOne %d ", counterZero, counterOne);
return 0;
}
}
printf("successCounterZero = %d successCounterOne = %d", counterZero, counterOne);
if (counterZero == counterOne)
return 1;
return 0;
}
我的输出不断输出,所以放了一些不影响代码跟踪问题的控制机制。这些是:
ct:计算在while循环中输入的次数。
printf(“CARRY%d \ n”,carry):显示进位值减1后的值。
printf(“breakCounterZero =& d breakCounterOne =%d”):显示0和1计数,如果它卡在“if(counterZero> counterOne)”,检查0计数不能高于1计数在每个while循环结束时。
printf(“successCounterZero =%d successCounterOne =%d”):显示是否已通过while循环。
我的问题是,如果我尝试让while循环工作,直到最后使用carry = 0,它输出210,它应该工作,因为它循环8次,在CARRY = -1它应该从循环中断虽然它像:
1 CARRY 6
2 CARRY 5
3 CARRY 4
4 CARRY 3
5 CARRY 2
6 CARRY 1
7 CARRY 0
8 CARRY -1
9 CARRY -2
breakCounterZero 5 breakCounterOne 4
所以它比它应该循环多1次,它再计数0,所以它失败了。但是我在while循环中将进位限制增加到1以查看发生了什么,它给出了:
1 CARRY 6
2 CARRY 5
3 CARRY 4
4 CARRY 3
5 CARRY 2
6 CARRY 1
7 CARRY 0
successCounterZero = 3 successCounterOne = 4
所以它通过了第三个条件,但是比第二个条件更少0,因此在第二个条件下失败。
这似乎是一个复杂且过于具体的问题,但感谢任何提示。
答案 0 :(得分:0)
我不确定您的binaryAddition
和binarySubtraction
函数 - 是否需要使用它们,或者只是使用它们来满足不使用算术运算的条件。< / p>
对于这个简单的案例,值得指出的是,你可以&#34;计算&#34;使用整数中的位最多31个。当然足以处理8个可能的值:
int checkOneToZero(unsigned num)
{
unsigned count_0s = 0;
unsigned count_1s = 0;
// Using a 'for' loop here because I know the start, stop, and update.
for (unsigned check_bit = 1 << 7; check_bit; check_bit >>= 1) {
if (num & check_bit) {
/* ++count_1s; */
count_1s |= (count_1s << 1) | 1;
}
else {
/* ++count_0s; */
count_0s |= (count_0s << 1) | 1;
if (count_0s > count_1s) return 0;
}
}
return count_0s == count_1s;
}