C++中异或的使用例题?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中异或的使用例题?相关的知识,希望对你有一定的参考价值。
如何设计一个程序将数据第一个字节的位(bit)全部反转(提示:使用^运算符)。提示:任意一位与1进行XOR运算由于XOR运算具有排它特性,因此若原位为0,则0^1得1,若原位为1,则1^1得0,使用此运算即可进行位(bit)反转。
参考技术A 这是要将什么数据的第一个字节的位(bit)全部反转(提示:使用^运算符)?以下的代码段能将一个int 的第一个字节全部反转:
int x;
scanf("%d",&x);
x=x^0xff000000; 参考技术B //以下函数能将任意基本整数类型的第一个字节全部反转
template <typename _T>
inline _T reverse(_T a)
return a ^ ((~(_T(0))) << ((sizeof(_T) - 1) * 8));
参考技术C
#include<stdio.h>
void main() unsigned int a; scanf("%u",&a); a^=0x0ff; printf("%x\\n",a);
与0异或得到的值不变,与1异或取反,因此变量中的数与低8位均为1的数异或可以满足题目要求。
go中异或运算带来的疑惑
最近在看go,遇到一个问题:
一时没看明白一元运算的异或运算是如何得到结果值的,代码如下:
var b uint8 = 15 var c int8 = 15 fmt.Printf(" b: %08b ", b) fmt.Printf("^b: %08b ", ^b) fmt.Printf(" c: %08b ", c) fmt.Printf("^c: %08b ", ^c) // 执行结果 b: 00001111 ^b: 11110000 c: 00001111 ^c: -0010000
按位补足 ^ : 该运算符与异或运算符一同使用,即 m^x,对于无符号x使用“全部位设置为1”,对于有符号x 时使用 m=-1 。
看上面的代码,和解释,对于无符号数值的运算比较好理解:
^15
等价于 1111 1111 ^ 0000 1111
结果: 1111 0000
但对于有符号数是如何计算出 -0010000 的呢?先上计算过程
^15
等价于 -1^15
等价于 1000 0001 ^ 0000 1111 (这里是原码)
等价于 1111 1111 ^ 0000 1111 (这里是补码)
结果 1111 0000 (这里是补码)
结果转为原码 1000 1111 (补码) +1 --> 1001 000 (原码)
涉及的概念:
原码、反码、补码,及转换过程
真值:符号位+数字的绝对值 就是真值:例如:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
这里还有一个概念:就是在系统中,数值使用补码来表示(存储)
原因:可以看这里 https://zhuanlan.zhihu.com/p/91967268
由补码求原码
- 如果补码的符号位为“0”,表示为正数,所以补码就是该数的原码。
- 如果补码的符号位为“1”,表示为负数,求原码的操作是:符号位不变,即为1,其余各位取反,然后再整个数加1
示例
1111 0000 -> 1000 1111 ->1000 1111 + 1 -> 1001 0000
反码通常是用来做 原码和补码转码的过渡。
其实是很基础的知识,但是多年没接触过,导致忘光了
如果想复习的话,可以看一下这里
原码、反码、补码 详解!不懂的请看过来!
https://www.cnblogs.com/resn/p/13396630.html
以上是关于C++中异或的使用例题?的主要内容,如果未能解决你的问题,请参考以下文章