我正在尝试将 16 位数字的最后 4 位显示为“密码” 该循环使用从末尾开始的第 4 位开始的掩码进行初始化,并将各个位的值(第 4 位、2^3、第 3 个 2^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;
}
}
最佳答案
此代码中有两个错误导致“密码”无法显示:
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
位在掩码
中。正如上面所评论的,您也可以简单地执行
if (mask & code)
因为在 C 语言中,mask & code
的任何非零结果都会被评估为 true。
此外,pow()
计算 2 的幂是多余的,因为您可以使用位移位,就像代码中其他地方所做的那样
sum = sum + (1 << ctr);
或
sum += 1 << ctr;
关于c - 在 C 中将按位值显示为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47387308/