C 编程 - XOR 位运算
Posted
技术标签:
【中文标题】C 编程 - XOR 位运算【英文标题】:C Programming - XOR Bitwise Operation 【发布时间】:2013-06-01 05:39:51 【问题描述】:下面的“C”语句执行什么操作?
星=星^0b00100100;
(A) 切换变星的第 2 位和第 5 位。
(B) 清除变星的第 2 位和第 5 位以外的所有位。
(C) 设置除变星的第 2 位和第 5 位之外的所有位。
(D) 将变星中的值乘以 0b00100100。
我仍然对此一无所知。有人可以帮帮我吗?
【问题讨论】:
脾气暴躁的回应:没有,因为那不会编译。作为标准,C 不支持二进制数的0b
前缀。
真的吗?但是这个问题出现在我过去的试卷上,所以我认为它会起作用。
star
的原始值是多少?
试试这个:tutorialspoint.com/ansi_c/c_bits_manipulation.htm
@D3FTY 顺便说一句,如果你知道这是 XOR 运算符,你为什么不 1. 已经知道它的作用(这对于从事 CS 和东西),2.如果你不这样做,你为什么不谷歌呢?
【参考方案1】:
它是 (A) 切换位 2 和 5。
以下是异或运算的真值表:
x y x^y
0 0 0
1 0 1
0 1 1
1 1 0
从表中可以看出x XOR 0 = x
和x XOR 1 = !x
。
XOR 是按位运算,因此它对单个位进行运算。因此,如果您将star
与某个常数进行异或运算,它将切换常数中的1
位。
您可以找到一些解释,例如here.
【讨论】:
有什么具体的解释吗?我还是不明白。 @H2CO3 好吧,如果我是哑巴,我很抱歉。但是你不能指望每个人都像你一样有同样的知识水平,聪明的亚历克斯。无意冒犯。【参考方案2】:如果两个输入相同,XOR 运算符返回 0,否则如果两个输入不同,则返回 1。例如给定真值表:-
a=1 b=1 => a^b=0, a=0 b=0 => a^b=0, a=0 b=1 => a^b=1, a=1 b=0 => a^b=1。【讨论】:
【参考方案3】:xor 是二元运算符,适用于 2 位。
xoring 规则:相同位 ans 为 0,不同位 ans 为 1 让
a= 1 0 1 0 1 1 b= 0 1 1 0 1 0 -------------- c= 1 1 0 0 0 1 --------------
逐位比较a和b的位 if 同样放 0 否则放 1 xor 基本上用于在给定的重复编号集中找到唯一的。 只是异或所有没有。你会得到唯一的(如果只有一个唯一的)
【讨论】:
【参考方案4】:exclusive OR
有这个真值表:
A B A^B
-----------
1 1 0
1 0 1
0 1 1
0 0 0
我们可以看到,如果B
是true
(1
),那么A
被翻转(切换),如果它是false
(0
),A
被单独留下。所以答案是(A)。
【讨论】:
答案是 C 怎么办?【参考方案5】:如果您知道 XOR 的工作原理,并且知道 ^
在 C 中是 XOR,那么这应该很简单。你应该知道 XOR 会翻转设置为 1 的位,设置 0b00100100 的位 2 和 5,因此它会翻转这些位。
从“测试期间”的角度来看,假设你需要向自己证明这一点,你真的不需要知道star
的初始值来回答这个问题,如果你知道^
是如何工作的然后把任何东西扔进去:
00100100
^10101010 (star's made up value)
---------
10001110 (star's new value)
bit position: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
|---|---|---|---|---|---|---|---
star's new v: | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0
|---|---|---|---|---|---|---|---
star's old v: | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0
然后再次检查你的答案,做到了吗:
(A) 切换变星的第 2 位和第 5 位。 (是)
(B) 清除除变星的第 2 位和第 5 位之外的所有位。 (没有)
(C) 设置除变量星的位 2 和 5 之外的所有位。 (没有)
(D) 将变星中的值与 0b00100100 相乘。 (36x170 = 142?不)
【讨论】:
【参考方案6】:XOR 运算符(也称为“逻辑加法”)定义如下:
a b a^b
-----------
0 0 0
0 1 1
1 0 1
1 1 0
所以a^0
保持a
不变,而a^1
切换它。
对于多位值,操作是按位执行的,即在操作数的对应位之间。
【讨论】:
以上是关于C 编程 - XOR 位运算的主要内容,如果未能解决你的问题,请参考以下文章
Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字
Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字