屏蔽数组成员的位

巴纳特

你能告诉我我的问题在哪里吗?我正在尝试测试数组的值。

每个值表示 16 位(标志),我需要检查标志是否已设置。

我当前的输出如下所示,也是预期的输出。

 #include <stdio.h>

    unsigned short value[1];
    unsigned int bitCheck(unsigned int mask, int pin);
    unsigned short mask;

int main(void){
    value[0]=0;
    value[1]=4095;


    int pin0 = 0;
    int pin1 = 1;

    unsigned int bit0= bitCheck( mask, pin0);
    unsigned int bit1= bitCheck( mask, pin1);


  for (int i =0;i<=1; i++)
{
    mask=value[i];
   printf("Mask = %d ==>>\n", mask);

   if ( bit0 == 1 ){
      printf("Pin %d is Set\n", pin0);
   }else{
      printf("Pin %d is not Set\n", pin0);
   }

    if ( bit1 == 1 ){
      printf("Pin %d is Set\n", pin1);
   }else{
      printf("Pin %d is not Set\n", pin1);
   }

   printf("\n"); 
}

}

unsigned int bitCheck(unsigned int mask, int bit){
   if ( (mask >> bit ) & 1){
      return 1;
   }else{
      return 0;
   }
}

我的输出是:

Mask = 0 ==>>
Pin 0 is not Set
Pin 1 is not Set

Mask = 4095 ==>>
Pin 0 is not Set
Pin 1 is not Set

它必须是:

Mask = 0 ==>>
Pin 0 is not Set
Pin 1 is not Set

Mask = 4095 ==>>
Pin 0 is Set
Pin 1 is Set
用户2371524

这段代码不必要地复杂,通过它的复杂性,隐藏了一个明显的逻辑错误。在为分配值bitCheck(mask, ...) 之前,您正在调用mask

改变这个:

    unsigned int bit0= bitCheck( mask, pin0);
    unsigned int bit1= bitCheck( mask, pin1);


  for (int i =0;i<=1; i++)
{
    mask=value[i];
   printf("Mask = %d ==>>\n", mask);

对此:

  for (int i =0;i<=1; i++)
{
    mask=value[i];

    unsigned int bit0= bitCheck( mask, pin0);
    unsigned int bit1= bitCheck( mask, pin1);

   printf("Mask = %d ==>>\n", mask);

也就是说,这里有一个理智的方法来做这一切:

#include <stdio.h>

#define BIT(n, v) (!!((v) & (1U << (n))))

int main(void)
{
    unsigned short values[] = {0, 4095};
    for (int i = 0; i < 2; ++i)
    {
        printf("value: %hu\n", values[i]);
        for (int bit = 0; bit < 16; ++bit)
        {
            printf( BIT(bit, values[i]) ?
                    "bit %d is set\n" :
                    "bit %d is not set\n", bit);
        }
    }
    return 0;
}

出于您的方法不被认为是明智的原因之一,请阅读DRY 原则编写 16 次相同的代码是违反此原则的一个简单示例 -> 您需要一个循环。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章