位运算 之按位异或(xor)^ 操作

按位异或运算

 俗称:xor运算

 

1xor的基本知识

 

我们来看看xor运算的机理:

 

1001011001011----àa

xor    1011010001110----àb

-------------------------

      0010001000101---àc

 

看了上面的式子,体会到异或运算的原理了吧,就是:0和1异或0都不变,异或1则取反。很容易理解,如果b中的某位为1,那么a xor b 的作用是在a相应的位进行取反操作。用通俗易懂的语言来讲就是xor运算通常用于对二进制的特定一位进行取反操作。

我们再看到上面那个计算式子,如果得到的结果c再与b做异或运算即:

 

0010001000101---àc

xor    1011010001110---àb

----------------------------------

      1001011001011---àd

 

注意到了吧,a == d  是成立的!那么我们可以得到一个结论:(a xor b) xor b = a。

同时我们还可以得到一个很诡异的swap操作:

a  ^=  b;  b ^= a; a ^= b;

自己拿起笔来模拟一下就很清楚的了。

 

2xor not (按位否)操作之间的关系

 

事实上很简单,nor操作是xor操作的一个特例。取反实质上就是同1做异或操作

~x =  x^0x FFFFFFFF

 

3、两个比较有趣的式子:(n ^(n+1))  ((n ^(n-1))+1)>>1

 

(1)首先来看(n ^(n+1))这个式子,假设n = 10011010, n+1 = 10011011,则:

 

10011010---àn

xor    10011011---àn+1

------------------------------------

      00000001---àans

 

如果还不能看出什么的话,再来一个例子:n = 11111111, n+1 = 100000000,则:

 

11110111---àn

xor     11111000---àn+1

-------------------------

      000001111---àans

 

得到的结果为n的倒数出现第一个0的位以及后面所有的1全部变成1,其它位都为0的数。

 

 

(2)再来看看((n ^(n-1))+1)>>1这个式子

假设n = 10011010, n-1 = 10011001,则:

 

10011010---àn

xor    10011001---àn-1

-----------------------------------------

      00000011---àans

ans+1 >> 1  = 000000100 >> 1 = 000000010

 

看出来了吧,也就是取出n出现倒数第一个1的位及该位后面的0组成的数

 

4、统计n1的奇偶性

 

思路:我们在按位与运算的时候学过了怎么计算一个整数中1的个数,但是我们现在用xor来解决吧:

x = x ^ (x>> 1);
x = x ^ (x>> 2);
x = x ^ (x>> 4);
x = x ^ (x>> 8);
x = x ^ (x>> 16);
return x& 1;

 

 

 

说道这里,顺便提一下怎么求解一个数n的前导0的个数,下面的代码来自Hacker's Delight


int nlz(unsigned x)
{
int n;
if (x ==  0return( 32);
   n =  1;
    if ((x >>  16) ==  0) {n = n + 16; x = x << 16;}
    if ((x >>  24) ==  0) {n = n +  8; x = x <<  8;}
    if ((x >>  28) ==  0) {n = n +  4; x = x <<  4;}
    if ((x >>  30) ==  0) {n = n +  2; x = x <<  2;}
   n = n - (x >>  31);
    return n;
} // 代码自己慢慢理解吧

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
十六进制字符串按位异或运算是一种常用的运算操作,可以用于数据加密、错误检测等领域。在Java中,我们可以通过使用BitSet和字符串转换为十六进制来实现该功能。 首先,我们可以将十六进制字符串转换为二进制表示,然后再进行按位异或运算。可以使用Integer类的parseInt方法来将十六进制字符串转换为整型,然后使用Integer.toBinaryString方法将其转换为二进制表示。 接下来,我们可以使用BitSet类创建一个位集合,将转换后的二进制字符串按位存储到位集合中。可以使用BitSet.set方法将指定位置的位设置为指定的值。需要注意的是,位集合的大小应该与二进制字符串的长度相匹配。 然后,我们可以定义一个用于进行按位异或运算的方法。可以使用BitSet类的xor方法来实现按位异或运算。该方法将对位集合的每个位执行按位异或运算,并返回一个新的位集合。 最后,我们可以将位集合转换回二进制字符串,并使用Integer.parseInt方法将其转换为十六进制字符串。 以下是一个示例代码片段,可以用于实现十六进制字符串按位异或运算的工具类: ``` import java.util.BitSet; public class HexXorTool { public static String xorHexStrings(String hexString1, String hexString2) { int int1 = Integer.parseInt(hexString1, 16); int int2 = Integer.parseInt(hexString2, 16); String binary1 = Integer.toBinaryString(int1); String binary2 = Integer.toBinaryString(int2); int maxLength = Math.max(binary1.length(), binary2.length()); BitSet bits1 = new BitSet(maxLength); BitSet bits2 = new BitSet(maxLength); for (int i = 0; i < binary1.length(); i++) { if (binary1.charAt(i) == '1') { bits1.set(i); } } for (int i = 0; i < binary2.length(); i++) { if (binary2.charAt(i) == '1') { bits2.set(i); } } BitSet result = bits1.xor(bits2); String binaryResult = result.toString(); int intResult = Integer.parseInt(binaryResult, 2); String hexResult = Integer.toHexString(intResult); return hexResult; } public static void main(String[] args) { String hexString1 = "A5"; String hexString2 = "3C"; String xorResult = xorHexStrings(hexString1, hexString2); System.out.println("Hex XOR Result: " + xorResult); } } ``` 该工具类可以接受两个十六进制字符串作为输入,并返回经过按位异或运算后的十六进制字符串。当我们在main方法中运行该代码时,将输出按位异或运算的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值