在C

时间:2017-11-20 07:53:09

标签: c binary bit-manipulation bitwise-operators mask

我试图将16位数字的最后4位显示为"密码" 使用从结尾的第4位开始的掩码初始化循环,并将位的值相加(第4位,2 ^ 3,第3位^ 2,依此类推),但它总是返回0。

有两个功能,一个提示用户输入将用作16位数的代码,将从中获取4位。

#define _CRT_SECURE_NO_WARNINGS     
#include <stdio.h>
#include <conio.h>

int get_code();
void display_binary(int num);

int main()
{
int code, password, signal, missiles, ctr;

code = get_code();
printf("\nThe code is %d\n", code);
printf("The code in Hexadecimal: %X\n", code);
printf("The code in binary:");
display_binary(code);

int sum = 0;
int mask = 1 << 3;
for (ctr = 3; ctr >= 0; ctr--)
{
    if ((mask & code) == 1)
        sum = sum + pow(2, ctr);
    else
        sum = sum + 0;
    mask >> 1;

}

printf("\n\nThe password is %d\n", sum);


_getch();
return 0;
}

/*===============================
    get_code
    no input
    int output
    prompts user for number
===============================*/
int get_code()
{
    int num;
    do
    {
         printf("Enter a whole number between -4000 and 4000, inclusive: ");
         scanf("%d", &num);
    } while (num > 4000 || num < -4000);
    return num;
}

/*================================
    display_binary 
    int input
    no output
    displays number in binary 
 ===============================*/
void display_binary(int num)
{
    int mask = 1 << 15;
    int ctr;
    for (ctr = 1; ctr <= 16; ctr++)
    {
        if ((mask & num) == 0)
            printf("0");
        else
            printf("1");
        if ((ctr % 4) == 0)
            printf(" ");
        mask = mask >> 1;
        }
    }

1 个答案:

答案 0 :(得分:0)

此代码中有两个错误阻止了密码&#39;显示:

int sum = 0;
int mask = 1 << 3;
for (ctr = 3; ctr >= 0; ctr--)
{
    if ((mask & code) == mask) // <=== not '1' but 'mask'
        sum = sum + pow(2, ctr);
    else
        sum = sum + 0;
    mask >>= 1;  // <=== '=' was missing

}

但当然你可以做到

int password = code & 0x0F;

(mask & code) == mask的原因是因为mask & code结果将清除所有code位,但mask中的位除外。您也可以,如上所述,只需

if (mask & code) 

因为mask & code的任何非零结果在C中被评估为真。

除了pow()计算2的幂是过分的,因为你可以使用位移,就像你在代码中的其他地方所做的那样

sum = sum + (1 << ctr); 

sum += 1 << ctr;