精华内容
下载资源
问答
  • ^按位异或运算符
    千次阅读
    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

    请大家阅读代码理解并上机试验

    更多相关内容
  • 按位与运算符:& 语法 expression & expression 备注 表达式可以是其他“与”表达式,或(遵循下面所述的类型限制)相等表达式、关系表达式、加法表达式、乘法表达式、指向成员的指针表达式、强制转换表达式、...
  • 本篇文章对C++按位异或运算符的使用进行了详细的分析介绍。需要的朋友参考下
  • 可进行十六进制字符串按位异或运算,就是输入十六进制数,每个十六进制数间输入空格,然后点输出即可得到结果
  • 参考网上的按位异或校验和计算器,优化了部分bug。如有问题,请给予反馈,谢谢!CSDN不给免费发布资源,抱歉了。。。
  • 网上下载的,转载一下,方便平时通信测试时做的一个计算小工具。献上给需要的人。 网上下载的,转载一下,方便平时通信测试时做的一个计算小工具。献上给需要的人。
  • 文章详解详解“& 位与 | 位或 ^ 按位异或”。
  • 即: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)  编辑  收藏

    展开全文
  • 文章摘要: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;

    展开全文
  • 从键盘读入两个整数,对它们进行按位异或操作,把操作结果二进制位放在字符数组str中,最后输出该字符串。提示:第2个空建议使用条件表达式(?表达式)实现!程序的运行效果应类似地如图1和图2所示,图1中的1270和...

    从键盘读入两个整数,对它们进行按位异或操作,把操作结果按二进制位放在字符数组str中,最后输出该字符串。提示:第2个空建议使用条件表达式(?表达式)实现!

    593af93d9c2ed1b700230b7caa284f43.png

    程序的运行效果应类似地如图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;

    }

    展开全文
  • 按位按位与是二进制与,比较两个二进制位数,如果上下同为0则为0,如果一个为1,一个为0则为0,如果同时为1则为1. 例:a=5,b=1, a的二进制数为00000000 00000000 00000000 00000101 b的二进制数为...
  • 位“异或”运算符 (^)是对两个表达式执行按位异或,下面为大家介绍下其具体的使用方法
  • 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...
  • 即: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按位异或...
  • 位与_位或_按位异或_运算的讲解,自我感觉不错!
  • /*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;/*...
  • 最近在看一些加密函数,其中总涉及到一些位运算,尤其是^(按位异或),经过多方查找资料,对^的理解深入,分享资料留作纪念!/*手册资料:位运算符位运算符允许对整型数中指定的位进行置位。如果左右参数都是字符串,则位...
  • 我们如何用一种简单的方法实现对十六进制的数按位翻转功能? 异或的功能是:相同取0,相异取1; 一个数跟0异或,则保持,一个数跟1异或,则翻转; 例如:实现0X01最后一的翻转,只需要和0X01异或一下。在比如...
  • 按位异或应用题

    2021-10-31 11:21:16
    首先第一道题如果不限制时间复杂度那么是有很多种解法的,但是在这里限制为O(N)的时间复杂度因此我们要另辟蹊径使用位运算的方法,在这里我采用的是按位异或据出题思路如下 我们首先要搞懂题目的意思,说有一段...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 152,217
精华内容 60,886
关键字:

按位异或

友情链接: speechenhancementcode.rar