-
2021-05-23 04:01:20
^表示按位异或运算符,顾名思义,相异,即不同则为1,反之为0
例如15和16进行异或运算,运算过程如下:15 0000 0000 0000 0000 0000 0000 0000 1111
16 0000 0000 0000 0000 0000 0000 0001 0000
^ ------------------------------------------
0000 0000 0000 0000 0000 0000 0001 1111
可以看到,经过按位异或运算后,其结果变成十进制应为31,大家务必弄清楚运算过程,然后再上机验证,代码如下:#include
int main()
{
int a;
a=15^16;
printf("a=%d\n",a);
return 0;
}
运算结果为:a=31
异或运算符的作用指定位数的翻转
如想对某个数字的低4位进行翻转,则可以将这个数字与15(二进制为00001111)进行按位异或运算,既可以将原数字的低四位进行翻转,即高四位不变,低四位0变1,1变0
与0异或还是原值
大家可以自行实验,一个数字与0进行异或,结果还是原值
交换两个数字
除了之前我们学习交换两个数字需要第三个变量做中介之外,如今可以通过异或运算进行,代码如下:#include
int swap(int *a,int *b)
{
if (*a!=*b)
{
*a=*a^*b;
*b=*b^*a;
*a=*a^*b;
}
return 0;
}
int main()
{
int a=5;
int b=5;
swap(&a,&b);
printf("a=%d b=%d\n",a,b);
return 0;
}
可以看到原先a为3,b为5,运行后得出:a=5 b=5
请大家阅读代码理解并上机试验
更多相关内容 -
C++中的按位与&、按位与或|、按位异或^运算符详解
2021-01-01 01:10:55按位与运算符:& 语法 expression & expression 备注 表达式可以是其他“与”表达式,或(遵循下面所述的类型限制)相等表达式、关系表达式、加法表达式、乘法表达式、指向成员的指针表达式、强制转换表达式、... -
C++按位异或运算符的使用介绍
2020-09-05 10:22:54本篇文章对C++按位异或运算符的使用进行了详细的分析介绍。需要的朋友参考下 -
十六进制字符串按位异或运算工具和java位异或运算
2017-10-27 16:36:33可进行十六进制字符串按位异或运算,就是输入十六进制数,每个十六进制数间输入空格,然后点输出即可得到结果 -
按位异或校验和计算器
2018-10-25 17:40:34参考网上的按位异或校验和计算器,优化了部分bug。如有问题,请给予反馈,谢谢!CSDN不给免费发布资源,抱歉了。。。 -
十六进制字符串按位异或校验和和校验工具
2019-01-15 03:54:05网上下载的,转载一下,方便平时通信测试时做的一个计算小工具。献上给需要的人。 网上下载的,转载一下,方便平时通信测试时做的一个计算小工具。献上给需要的人。 -
详解“& 按位与 | 按位或 ^ 按位异或”
2020-08-04 05:42:28文章详解详解“& 按位与 | 按位或 ^ 按位异或”。 -
深入理解按位异或运算符
2021-04-24 01:56:54即:0^0 = 0,1^0 = 1,0^1 = 1,1^1 = 0按位异或的3个特点:(1) 0^0=0,0^1=1 0异或任何数=任何数(2) 1^0=1,1^1=0 1异或任何数-任何数取反(3) 任何数异或自己=把自己置0按位异或的几个常见用途:(1) 使某些特定的位...参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。
即:
0^0 = 0,
1^0 = 1,
0^1 = 1,
1^1 = 0
按位异或的3个特点:
(1) 0^0=0,0^1=1 0异或任何数=任何数
(2) 1^0=1,1^1=0 1异或任何数-任何数取反
(3) 任何数异或自己=把自己置0
按位异或的几个常见用途:
(1) 使某些特定的位翻转
例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。
10100001^00000110 = 10100111
(2) 实现两个值的交换,而不必使用临时变量。
例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:
a = a^b; //a=10100111
b = b^a; //b=10100001
a = a^b; //a=00000110
(3) 在汇编语言中经常用于将变量置零:
xor a,a
(4) 快速判断两个值是否相等
举例1: 判断两个整数a,b是否相等,则可通过下列语句实现:
return ((a ^ b) == 0)
举例2: Linux中最初的ipv6_addr_equal()函数的实现如下:
static inline int ipv6_addr_equal(const struct in6_addr *a1, const struct in6_addr *a2)
{
return (a1->s6_addr32[0] == a2->s6_addr32[0] &&
a1->s6_addr32[1] == a2->s6_addr32[1] &&
a1->s6_addr32[2] == a2->s6_addr32[2] &&
a1->s6_addr32[3] == a2->s6_addr32[3]);
}
可以利用按位异或实现快速比较, 最新的实现已经修改为:
static inline int ipv6_addr_equal(const struct in6_addr *a1, const struct in6_addr *a2)
{
return (((a1->s6_addr32[0] ^ a2->s6_addr32[0]) |
(a1->s6_addr32[1] ^ a2->s6_addr32[1]) |
(a1->s6_addr32[2] ^ a2->s6_addr32[2]) |
(a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0);
}
5 应用通式:
对两个表达式执行按位异或。
result = expression1 ^ expression2
参数
result
任何变量。
expression1
任何表达式。
expression2
任何表达式。
说明
^ 运算符查看两个表达式的二进制表示法的值,并执行按位异或。该操作的结果如下所示:
0101 (expression1)1100 (expression2)----1001 (结果)当且仅当只有一个表达式的某位上为 1 时,结果的该位才为 1。否则结果的该位为 0。
只能用于整数
下面这个程序用到了“按位异或”运算符:
class E
{ public static void main(String args[ ])
{
char a1='十' , a2='点' , a3='进' , a4='攻' ;
char secret='8' ;
a1=(char) (a1^secret);
a2=(char) (a2^secret);
a3=(char) (a3^secret);
a4=(char) (a4^secret);
System.out.println("密文:"+a1+a2+a3+a4);
a1=(char) (a1^secret);
a2=(char) (a2^secret);
a3=(char) (a3^secret);
a4=(char) (a4^secret);
System.out.println("原文:"+a1+a2+a3+a4);
}
}
就是加密啊解密啊
char类型,也就是字符类型实际上就是整形,就是数字.
计算机里面所有的信息都是整数,所有的整数都可以表示成二进制的,实际上计算机只认识二进制的.
位运算就是二进制整数运算啦.
两个数按位异或意思就是从个位开始,一位一位的比.
如果两个数相应的位上一样,结果就是0,不一样就是1
所以111^101=010
那加密的过程就是逐个字符跟那个secret字符异或运算.
解密的过程就是密文再跟同一个字符异或运算
010^101=111
至于为什么密文再次异或就变原文了,这个稍微想下就知道了..
posted on 2013-07-18 18:55 奋斗成就男人 阅读(158) 评论(0) 编辑 收藏
-
Java 按位异或的性质及其妙用
2021-03-09 15:42:06文章摘要:1、按位异或,可以简单理解成:不进位加法。即:1+1=0;0+0=0;1+0 =1;2、任何数和自己异或结果为零。3、按位异或自反性。两次运算操作,可以将最后的结果还原。4、任何数和0做异或值不变,和1异或结果为...文章摘要:
1、按位异或,可以简单理解成:不进位加法。即:1+1=0;0+0=0;1+0 =1;
2、任何数和自己异或结果为零。
3、按位异或自反性。两次运算操作,可以将最后的结果还原。
4、任何数和0做异或值不变,和1异或结果为原操作数取反。
5、交换律。不使用中间变量,交换两个数。
一、按位异或具有自反性。即:对同一个数据,进行两次按位异或操作,等于数据本身。
int displayOptions = 0x1100;
int flag = 0x1001;
int result = displayOptions ^ flag;
System.out.println(Integer.toHexString(displayOptions)
+ " ^ " + Integer.toHexString(flag)
+ " = " + Integer.toHexString(result));
//第一次运算:1100 ^ 1001 = 0101
result = result ^ flag;
System.out.println(Integer.toHexString(displayOptions)
+ " ^ " + Integer.toHexString(flag)
+ " = " + Integer.toHexString(result));
// 第二次运算:0101 ^ 1001 = 1100(displayOptions)
//我们还可以直接使用如下的代码直接进行测试:
System.out.println(Integer.toHexString(displayOptions ^ flag ^ flag));
二、应用案例
场景:
大房子中有很多关闭的电灯,随机操作电灯开关,实时显示房间中电灯的状态,并允许一键关闭所有电灯。【只允许使用按位异或】
分析:
1、连续两次操作电灯开关,电灯将处于操作前状态。
2、关闭所有开关。任何数和自己异或结果为零。
实现:
1、定义“大房子”类。
lightFlags 标识房间全部电灯实时状态。
封装电灯操作方法以及一键关闭所有电灯的方法。
/**
* 1、按位运算操作应用。
* 2、走廊灯、厕所灯、厨房灯、主卧灯、次卧灯分别对应一个字段位
* 走廊灯=0000 0001
* 厕所灯=0000 0010
* 厨房灯=0000 0100
* 主卧灯=0000 1000
* 次卧灯=0001 0000
* @author DrodYoung
*/
static class 大房子{
private static final int 走廊灯 = (1 << 0); // 1{0000 0001}
private static final int 厕所灯 = (1 << 1); // 2{0000 0001}
private static final int 厨房灯 = (1 << 2); // 4{0000 0001}
private static final int 主卧灯 = (1 << 3); // 8{0000 0001}
private static final int 次卧灯 = (1 << 4); //16{0000 0001}
private static final int LIGHT_MASK = 走廊灯|
厕所灯|
厨房灯|
主卧灯|
次卧灯;
//lightFlags = 电灯状态标记字段。
private int lightFlags = 0;
private void 操作电灯开关(int flag){
lightFlags ^= flag;
}
//任何数和自己异或结果为零。
private void 让所有的灯关闭(){
操作电灯开关(lightFlags);
}
@Override
public String toString() {
return "房子中电灯状况:\n"
+"走廊灯="+(((lightFlags&走廊灯)!=0)?"开":"关")+"\n"
+"厕所灯="+(((lightFlags&厕所灯)!=0)?"开":"关")+"\n"
+"厨房灯="+(((lightFlags&厨房灯)!=0)?"开":"关")+"\n"
+"主卧灯="+(((lightFlags&主卧灯)!=0)?"开":"关")+"\n"
+"次卧灯="+(((lightFlags&次卧灯)!=0)?"开":"关")+"\n";
}
}
2、测试:
//1、初始化大房子对象
大房子 hourse = new 大房子();
System.out.println(hourse);
//2、操作厨房灯开关
hourse.操作电灯开关(大房子.厨房灯);
System.out.println(hourse);//厨房灯为【开】
//3、再次操作厨房灯开关
hourse.操作电灯开关(大房子.厨房灯);
System.out.println(hourse);//厨房灯为【关】
//4、依次操作主卧灯、次卧灯、走廊灯开关
hourse.操作电灯开关(大房子.主卧灯);
hourse.操作电灯开关(大房子.次卧灯);
hourse.操作电灯开关(大房子.走廊灯);
//5、一键关闭所有灯
hourse.让所有的灯关闭();
System.out.println(hourse);
三、总结:
妙用按位异或,可以让代码更加简洁、高效。本例演示了按位异或的自反性,异或还有其他妙用,我们可以总结如下:
1、按位异或,可以简单理解成:不进位加法。即:1+1=0;0+0=0;1+0 =1;
2、任何数和自己异或结果为零。
3、任何数和0做异或值不变,和1异或结果为原操作数取反。
4、交换律。不使用中间变量,交换两个数。
a=a^b;
b=a^b;
a=a^b;
-
C语言位数算,按位异或.只知道按位异或原理 不知道这题怎么做
2021-05-19 09:57:19从键盘读入两个整数,对它们进行按位异或操作,把操作结果按二进制位放在字符数组str中,最后输出该字符串。提示:第2个空建议使用条件表达式(?表达式)实现!程序的运行效果应类似地如图1和图2所示,图1中的1270和...从键盘读入两个整数,对它们进行按位异或操作,把操作结果按二进制位放在字符数组str中,最后输出该字符串。提示:第2个空建议使用条件表达式(?表达式)实现!
程序的运行效果应类似地如图1和图2所示,图1中的127 0和图2中的123 456是从键盘输入的内容。
Please input num1 and num2 : 127 0
127 ^ 0 = 00000000000000000000000001111111
Please input num1 and num2 : 123 456
123 ^ 456 = 00000000000000000000000110110011
需要填空的题目如下, 在Found下添加:
#include
int main(void)
{
unsigned long int number, num1, num2, mask;
int i;
char str[33];
printf("Please input num1 and num2 : ");
scanf("%lu %lu", &num1, &num2);
/*********Found************/
mask = __________________;
number = num1 ^ num2;
for(i=0; i<32; i++)
{
/*********Found************/
str[i] = __________________;
mask >>= 1;
}
str[32] = '\0';
printf("%lu ^ %lu = %s\n", num1, num2, str);
return 0;
}
-
按位与,按位或,按位异或的理解
2021-08-24 20:19:22按位与 按位与是按二进制位与,比较两个二进制位数,如果上下同为0则为0,如果一个为1,一个为0则为0,如果同时为1则为1. 例:a=5,b=1, a的二进制数为00000000 00000000 00000000 00000101 b的二进制数为... -
JavaScript中按位“异或”运算符使用介绍
2020-10-26 03:53:04按位“异或”运算符 (^)是对两个表达式执行按位异或,下面为大家介绍下其具体的使用方法 -
C语言 按位异或运算
2021-11-08 18:42:54按位异或运算: 规律:无论0或1,异或1取反,异或0不变 变量交换: 题一:给定两个数 a 和 b ,用异或运算交换它们的值。 思路: 1)中间量t = a^b 2) b = tb,相当于abb,根据异或性质知道ab^b = a,所以b = t^b就是b... -
按位异或运算符的讲解 (详细)
2021-03-02 10:52:30按位异或运算 按位异或运算是数学或者计算机中运用到的数据处理的方法。感觉是一种思路,当然也是运用到了他的原理。 异或运算 首先异或表示当两个数的二进制表示,进行异或运算时,当前位的两个二进制表示不同则为1... -
转:[Java] 深入理解按位异或运算符
2021-03-09 15:42:05即:0^0 = 0,1^0 = 1,0^1 = 1,1^1 = 0例如:10100001^00010001=10110000按位异或的3个特点:(1) 0^0=0,0^1=1 0异或任何数=任何数(2) 1^0=1,1^1=0 1异或任何数-任何数取反(3) 任何数异或自己=把自己置0按位异或... -
按位与_按位或_按位异或_运算
2011-12-08 13:47:45按位与_按位或_按位异或_运算的讲解,自我感觉不错! -
C语言 按位异或实现加法(示例代码)
2021-05-19 07:10:32/*C语言 按位异或实现加法*/#include#include#includevoidtest1(){int a = 2;int b = 3;int cand = 0;int cxor = 0;int c = 0;//实现c=a+b//1.不考虑进位,按位计算各位累加(用异或实现),得到值xor;cxor = a^b;/*... -
对php位运算^(按位异或)的理解
2021-03-05 12:54:29最近在看一些加密函数,其中总涉及到一些位运算,尤其是^(按位异或),经过多方查找资料,对^的理解深入,分享资料留作纪念!/*手册资料:位运算符位运算符允许对整型数中指定的位进行置位。如果左右参数都是字符串,则位... -
按位异或实现十六进制数按位反转
2021-12-14 23:48:13我们如何用一种简单的方法实现对十六进制的数按位翻转功能? 异或的功能是:相同取0,相异取1; 一个数跟0异或,则保持,一个数跟1异或,则翻转; 例如:实现0X01最后一位的翻转,只需要和0X01异或一下。在比如... -
按位异或应用题
2021-10-31 11:21:16首先第一道题如果不限制时间复杂度那么是有很多种解法的,但是在这里限制为O(N)的时间复杂度因此我们要另辟蹊径使用位运算的方法,在这里我采用的是按位异或据出题思路如下 我们首先要搞懂题目的意思,说有一段...