萌新,计算问题,a |= 0x0002和a |= 0x0001;分别代表什么意思啊。。

karl_xy 2019-03-06 02:51:58
我知道a |= 0x0002等价于a=a|0x0002
但我不懂这么计算是什么意思啊。。
...全文
2194 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
拥抱Linux 2019-03-06
  • 打赏
  • 举报
回复
引用 6 楼 karl_xy 的回复:
[quote=引用 4 楼 儿童节 的回复:]
(1)竖线「|」是按位(或)运算符,具体的运算结果是「哪个位与1做按位或的运算,那个位就会变成1。」
(2)回到你的提问里,语句「a |= 0x0002;」的右边是十六进制数,值是十进制里的2,它在内存里的二进制编码(补码)的最后一个字节是0000 0010,前面的3个字节都是0就不谈了。
(3)那么根据上面第1点说的,具体运算是「哪个位与1做按位或的运算,那个位就会变成1」,那我们就来看看变量a是多少吧。假设a的值是1(十进制),它在内存里的二进制编码(补码)的最后一个字节就是0000 0001,同样,前面的3个字节都是0也不谈了,那么它与0x0002做按位或(|)运算的话,很明显嘛,它的最后一个字节的倒数第2个0就变成1了,而其它位不变,所以假如变量a的值是1的话,a | 0x0002 的结果就是,a的值变成了 3,因为0000 0011就是十进制的3嘛。《内存里的二进制存储是没有空格的,这里每4位一个空格只是为了美观。》
(4)那么同样的道理,对于语句「a | 0x0001;」,变量 a 与 0x0001 做按位或运算,而0x0001在内存里的二进制编码的最后一个字节是0000 0001,也就是最后一位是1,所以语句的结果就是 a 的二进制编码的最后一位数变成1。 那么,假设a的值是1(十进制),它的二进制编码的最后一个字节是0000 0001,那么按位或运算之后和运算之前是一样的,还是1;假设a的值是4(十进制),它的二进制编码的最后一个字节是0000 0100,那么按位或运算后,就变成了0000 0101,转换回十进制就是5了,也就是a的值就变成5了。

666 谢谢啦[/quote]
不用客气。
另外,还有一点点小的补充,就是上面的回答是针对你提问的「a |= 0x0002;」与「a |= 0x0001;」的,变量a最后是被赋值了的。只不过刚刚回答的时候写得有点儿急,有几个地方把赋值符号(=)漏写了,请不要混淆哈。
换句话说,如果是「a | 0x0002;」的话,那么只是这个表达式的值是变量a与0x0002做按位或运算的结果,但是变量a本身并没有被赋值,那么变量a的值并没有变。
祝学习进步!
karl_xy 2019-03-06
  • 打赏
  • 举报
回复
引用 4 楼 儿童节 的回复:
(1)竖线「|」是按位(或)运算符,具体的运算结果是「哪个位与1做按位或的运算,那个位就会变成1。」
(2)回到你的提问里,语句「a |= 0x0002;」的右边是十六进制数,值是十进制里的2,它在内存里的二进制编码(补码)的最后一个字节是0000 0010,前面的3个字节都是0就不谈了。
(3)那么根据上面第1点说的,具体运算是「哪个位与1做按位或的运算,那个位就会变成1」,那我们就来看看变量a是多少吧。假设a的值是1(十进制),它在内存里的二进制编码(补码)的最后一个字节就是0000 0001,同样,前面的3个字节都是0也不谈了,那么它与0x0002做按位或(|)运算的话,很明显嘛,它的最后一个字节的倒数第2个0就变成1了,而其它位不变,所以假如变量a的值是1的话,a | 0x0002 的结果就是,a的值变成了 3,因为0000 0011就是十进制的3嘛。《内存里的二进制存储是没有空格的,这里每4位一个空格只是为了美观。》
(4)那么同样的道理,对于语句「a | 0x0001;」,变量 a 与 0x0001 做按位或运算,而0x0001在内存里的二进制编码的最后一个字节是0000 0001,也就是最后一位是1,所以语句的结果就是 a 的二进制编码的最后一位数变成1。 那么,假设a的值是1(十进制),它的二进制编码的最后一个字节是0000 0001,那么按位或运算之后和运算之前是一样的,还是1;假设a的值是4(十进制),它的二进制编码的最后一个字节是0000 0100,那么按位或运算后,就变成了0000 0101,转换回十进制就是5了,也就是a的值就变成5了。

666 谢谢啦
karl_xy 2019-03-06
  • 打赏
  • 举报
回复
引用 1 楼 ForgetTomorrow 的回复:
按位“与或”运算符 (|) 将第一个操作数的每个位与第二个操作数的对应位进行比较。如果其中一个位是 1,则将对应的结果位设置为 1。否则,将对应的结果位设置为 0。

为什么不直接赋值 是1就赋值1 是0就赋值0 这样做有什么好处啊
拥抱Linux 2019-03-06
  • 打赏
  • 举报
回复
(1)竖线「|」是按位(或)运算符,具体的运算结果是「哪个位与1做按位或的运算,那个位就会变成1。」
(2)回到你的提问里,语句「a |= 0x0002;」的右边是十六进制数,值是十进制里的2,它在内存里的二进制编码(补码)的最后一个字节是0000 0010,前面的3个字节都是0就不谈了。
(3)那么根据上面第1点说的,具体运算是「哪个位与1做按位或的运算,那个位就会变成1」,那我们就来看看变量a是多少吧。假设a的值是1(十进制),它在内存里的二进制编码(补码)的最后一个字节就是0000 0001,同样,前面的3个字节都是0也不谈了,那么它与0x0002做按位或(|)运算的话,很明显嘛,它的最后一个字节的倒数第2个0就变成1了,而其它位不变,所以假如变量a的值是1的话,a | 0x0002 的结果就是,a的值变成了 3,因为0000 0011就是十进制的3嘛。《内存里的二进制存储是没有空格的,这里每4位一个空格只是为了美观。》
(4)那么同样的道理,对于语句「a | 0x0001;」,变量 a 与 0x0001 做按位或运算,而0x0001在内存里的二进制编码的最后一个字节是0000 0001,也就是最后一位是1,所以语句的结果就是 a 的二进制编码的最后一位数变成1。 那么,假设a的值是1(十进制),它的二进制编码的最后一个字节是0000 0001,那么按位或运算之后和运算之前是一样的,还是1;假设a的值是4(十进制),它的二进制编码的最后一个字节是0000 0100,那么按位或运算后,就变成了0000 0101,转换回十进制就是5了,也就是a的值就变成5了。
lin5161678 2019-03-06
  • 打赏
  • 举报
回复
不是判断 是修改 把a的第2个bit设置为1 即 原先是1 不变 原先是0 修改为1
usecf 2019-03-06
  • 打赏
  • 举报
回复
判断第几位有1 你把 2 换成2进制就是10
ForgetTomorrow 2019-03-06
  • 打赏
  • 举报
回复
按位“与或”运算符 (|) 将第一个操作数的每个位与第二个操作数的对应位进行比较。如果其中一个位是 1,则将对应的结果位设置为 1。否则,将对应的结果位设置为 0。

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧