Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 寻找这个涉及逻辑运算的答案的清晰性_C_Bit Manipulation_Bitwise Operators_Logical Operators - Fatal编程技术网

C 寻找这个涉及逻辑运算的答案的清晰性

C 寻找这个涉及逻辑运算的答案的清晰性,c,bit-manipulation,bitwise-operators,logical-operators,C,Bit Manipulation,Bitwise Operators,Logical Operators,我正在做一个家庭作业的问题,我已经得到了正确的答案,但这是添加运算符的结果,所以我希望有人能为我澄清这一点 我正在测试一个数字是正数还是负数,如果x>0,则返回1,否则返回0。仅使用位操作!~&^ |+> 我的答案是:!(x>>31 |!x) 当我把它写在纸上时,我对它的理解就崩溃了 将标志位一直向右移动 还是那一点!x 正值为0 | 1 负值为1 | 0 !!结果总是,不管怎样,最终都是0 !!(0 | 1)=0 !!(1 | 0)=0 我理解错了什么 我想你在寻找: size_t s

我正在做一个家庭作业的问题,我已经得到了正确的答案,但这是添加运算符的结果,所以我希望有人能为我澄清这一点

我正在测试一个数字是正数还是负数,如果x>0,则返回1,否则返回0。仅使用位操作!~&^ |+>

我的答案是:!(x>>31 |!x)

当我把它写在纸上时,我对它的理解就崩溃了

  • 将标志位一直向右移动
  • 还是那一点!x
    • 正值为0 | 1
    • 负值为1 | 0
  • !!结果总是,不管怎样,最终都是0
    • !!(0 | 1)=0
    • !!(1 | 0)=0

  • 我理解错了什么

    我想你在寻找:

    size_t shift = sizeof(x) * 8 - 1;
    bool ans = x | ~(1 << shift);
    
    size\u t shift=sizeof(x)*8-1;
    bool ans=x | ~(1你离开的地方在#2中:

    • 如果x为正,x>>31==0和!x==0所以!(0 | 0)==1
    • 如果x为负,那么x>>31==1和!x==0所以!(1 | 0)==0
    • 如果x为零,那么x>>31==0和!x==1所以!(0 | 1)==0

    是布尔not。按位not是
    ~
    。无论
    x
    有什么符号,如果它不是零,那么
    !x
    就是零。为什么正x会导致!x=1?亨特-!0=1对吗?如果x是正的(0)!x=1.对吗?@jlee当您执行
    x>>31
    时,您将通过将x中的值移位31位得到一个值…但您不会更改实际的
    x
    。因此
    !x
    对x中的原始值进行操作,而不是对
    x>>31
    中的移位值进行操作。因此
    !x
    仅在x为0时给出
    1
    。@Dmitri感谢您对于这个解释,我理解我的困惑。对不起,我想你误解了我的问题。我的答案是正确的(至少测试脚本是这样说的)。我只是想澄清一下我在推理中的错误之处。为了避免实现定义的行为,还建议将
    x
    强制转换为无符号类型。谢谢!这正是我想要的。我仍然不明白为什么,因为x是正的,!x=0。如果x是正的,符号位将是0。所以我不会这样做!0=1?还是我完全理解这一点wrong@jlee如果x为正,则它不是零。您将x与x>>31混淆。
    是逻辑求反运算符。因此,在布尔上下文中!如果x为0,则x为1;如果x为非零,则x为0。我知道我错在哪里了。出于某种原因,我认为x的值被更改为t它的符号位,我在做符号位|!符号位,这当然是错误的