我必须编写一个返回'S'的C程序,如果一个数字的LSB和MSB都被设置,则返回'R',如果没有设置数字的LSB和MSB,如果LSB是,则返回'L'如果设置了MSB而不是LSB,则设置但不设置MSB并返回“M”。在这里,我制作了一个只设置LSB的程序,但我对另一个逻辑有问题。请帮帮我。
#include<stdio.h>
#include<conio.h>
char result;
char set_reset(unsigned int number)
{
if(number & 1)
result='L';
return result; // Do not change the return
}
int main (void)
{
char result_value;
result_value = set_reset(150); // it should return 'M'
result_value = set_reset(11); // it should return 'L'
result_value = set_reset(171); // it should return 'S'
result_value = set_reset(42); // it should return 'R'
}
答案 0 :(得分:1)
首先,我认为您的功能定义存在问题。您的代码需要unsigned int
,但在main
中您写171
将导致S
(即MSB和LSB都设置)。这不会发生,因为unsigned int
超过8位。
所以我猜你想要:
char set_reset(unsigned char number)
^^^^
在这种情况下,你的程序可能是:
#include <stdio.h>
#include <limits.h>
char set_reset(unsigned char number)
{
unsigned int lsb = number & 1;
unsigned int msb = number & (1 << (CHAR_BIT-1));
if (lsb && msb) return 'S';
if (lsb) return 'L';
if (msb) return 'M';
return 'R';
}
int main (void)
{
printf("%c\n", set_reset(150));
printf("%c\n", set_reset(11));
printf("%c\n", set_reset(171));
printf("%c\n", set_reset(42));
}
输出:
M
L
S
R
请注意,limits.h中的CHAR_BIT是char中的位数。通常它是8但不保证。因此最好从limits.h中取出它。