【问题标题】:Hex to bin after logical operations逻辑运算后的十六进制到 bin
【发布时间】:2011-02-26 14:08:03
【问题描述】:

我想要:

111 || 100  ---> 111,  not 1
100 && 100  ---> 100,  not 1
101 && 010  ---> 000,  not 0

破码

#include <stdio.h>

main(void){
        string hexa = 0xff;
        strig hexa2 = 0xf1;

        // CONVERT TO INT??? cast
        int hexa3 = hexa || hexa2;
        int hexa4 = hexa && hexa2;

        puts(hexa3);
        puts(hexa4);
}

【问题讨论】:

    标签: c casting hex


    【解决方案1】:

    您需要按位运算符(|&amp;)而不是逻辑运算符(||&amp;&amp;):

    110 | 011 --> 111
    110 & 101 --> 100
    

    至于您损坏的代码,hexahexb 的类型也不正确,它们都应该是数字类型:

    int hexa = 0xff;
    int hexa2 = 0xf1;
    

    最后,要输出一个整数,你可以使用printf 来格式化它们:

    printf("hexa3 = 0x%08x\n", heaxa3);   // display as 8 digit, 0 padded hex
    

    【讨论】:

    • ||和 && 也是二元运算符。我认为您的意思是“按位”。
    • @sepp2k - 谢谢,我能更好地记住这些功能的工作原理,而不是它们的正确名称
    • @user355926 | & 返回完整的二进制文件
    • 可以用类似的方式使用终端的printf吗?
    • 执行位操作时,首选unsigned int 而不是intunsigned int 让您可以使用所有位,而不必处理符号扩展。
    【解决方案2】:
    1. string 在这里不是正确的数据类型。数字 0xff(二进制为 11111111)和字符串“0xff”之间存在很大差异。我假设你想处理前者;将字符串解析为整数本身就是一个完整的主题。 16 位序列的一种好的数据类型是unsigned int
    2. || 之间有很大区别和|。前者执行所谓的“逻辑”或:它将两个操作数都转换为布尔值,然后如果至少有一个操作数为真,则返回真,否则返回假。如果操作数为 0,则将其转换为 false,否则转换为 true。因此,对于您的示例, 0xff 和 0xf1 都转换为 true,并且 true ||真 == 真。这就是您的代码打印 1 的原因。

    旁注:即使是布尔值,||和 |由于短路而有所不同:当您拥有a || b 时,仅在 a 为假时才评估 b。两个参数都针对a | b 进行评估。这很重要,即,当两个操作数之一是具有副作用的函数调用时。

    【讨论】:

      猜你喜欢
      • 2018-04-19
      • 2019-02-27
      • 2019-03-11
      • 1970-01-01
      • 2015-06-15
      • 2021-02-21
      • 2013-06-12
      • 2011-12-09
      • 2012-09-12
      相关资源
      最近更新 更多