我试图将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;
}
}
答案 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;