c - 在 C 中将按位值显示为整数

标签 c binary bit-manipulation bitwise-operators mask

我正在尝试将 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/

相关文章:

c - 隐式函数声明在 C89 中合法吗?

c - 如何将数字更改为 C 中的变量?

mysql - 在 CIDR 范围 MySQL 中查找 IPv6 的正确方法

c - C中的popen()和system()有什么区别

c - 我的成员(member)值(value)发生了什么变化?

r - 选择十进制数的所有二进制邻居

binary - Code Golf - 十六进制到(原始)二进制转换

java - Android ffmpgeg - 没有任何反应

java - 一个测试用例的更新位错误

c - 仅使用按位运算符实现逻辑非(除了!)