【问题标题】:combined bit and logical operators in cc中的组合位和逻辑运算符
【发布时间】:2013-09-27 07:33:08
【问题描述】:

我对其中一些操作感到困惑(组合按位和逻辑操作)。

如果 x = 0x3F 和 y = 0x75,求 diff c 表达式的字节值:

1) x&y
2) x | y
3) ~x | ~y
4) x & ~y
5) x && y
6) x || y
7) !x || !y
8) x && ~y

尝试

首先,我将十六进制转换为二进制:

x = 00111111
y = 01110101

这是我的尝试

1) 00110101
2) 01111111
3) 01111111
4) x & not y?  isn't the bang operator a logical operator?  what is the bit representation of !y?
5) x && y = TRUE = but how is that represented as a byte? 11111111?
6) x || y = how can this be represented as a byte?
7) !x || y = ???
8) x && ~y = ?????

【问题讨论】:

  • 您对 3 的回答是错误的。 ~x 有一个第一位,所以~x | ~y 也必须。

标签: c binary bit-manipulation bit logical-operators


【解决方案1】:

逻辑非运算符! 将“真”值转换为“假”,反之亦然。并且由于任何非零都被认为是“真”,因此运算符简单地为任何非零返回零。

这导致x & !y 为零,因为用零屏蔽任何东西都是零。

“真”和“假”的逻辑值分别指定为10。这意味着逻辑运算符(即&&|| 或一元!)的结果始终为10

如果您结合上面的两个语句,您就会明白为什么使用双逻辑非 (!!)(您可能在某处看到过)总是返回 01

【讨论】:

  • 好的,但是 5 号呢? && 是合乎逻辑的,所以 x && y 返回 true(因为两者都不为零),但是答案的位表示形式是什么? 11111111?
  • @JonSmith 再次阅读我的答案。逻辑运算总是返回010 的位模式是01 的位模式是1
  • @JonSmith 或 00000000000000000000000000000001 在 32 位机器上。不管你如何分割它,一个总是一个,不管你在前面放了多少个零,或者你使用哪个基数(十六进制、二进制、八进制、36)。您不会说 十进制 值 1 与十进制值 01 不同,对吗?
  • 让我们试试这个方法:(NUMBER 不为零)= TRUE,TRUE = 1。是的,它不可逆!
【解决方案2】:

7) !x || !y = 0

最好根据 TRUE 和 FALSE 来思考,因为 ||运算符。

 X = TRUE, y = TRUE 
 --> !x = FALSE
 --> !y = FALSE
 ----> FALSE OR FALSE = FALSE (0).

【讨论】:

  • 然后 x && ~y == TRUE && TRUE == TRUE?
  • 我们正在接近:-)。是的。请注意:您最好这样写:
  • x && ~y --> 对 && 对 --> 对
  • 实际上,在 c 中,"x && ~y == TRUE && TRUE == TRUE" 这是一个有效的表达式(整行本身!),如果你把
  • #define TRUE 1 #define FALSE 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2017-01-28
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多