C 寻找这个涉及逻辑运算的答案的清晰性
我正在做一个家庭作业的问题,我已经得到了正确的答案,但这是添加运算符的结果,所以我希望有人能为我澄清这一点 我正在测试一个数字是正数还是负数,如果x>0,则返回1,否则返回0。仅使用位操作!~&^ |+> 我的答案是:!(x>>31 |!x) 当我把它写在纸上时,我对它的理解就崩溃了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
- 正值为0 | 1
- 负值为1 | 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它的符号位,我在做符号位|!符号位,这当然是错误的