异或 ^ 的几个作用


一、交换两个整数的值而不必用第三个参数
a = 9;
b = 11;

a=a^b; 1001^1011=0010
b=b^a; 1011^0010=1001
a=a^b;  0010^1001=1011

a = 11;
b = 9;

二、奇偶判断

^a操作就是将a中的每一位按位逐一进行异或,例如a=4'b1010,则b=1^0^1^0=0,由此可以判断a中为1的位数是奇数还是偶数,是一个便捷的操作。

三、格雷码(Gray code)

    格雷码(Gray code)是由贝尔实验室的Frank Gray在1940年提出,用于在PCM(Pusle Code Modulation)方法传送讯号时防止出错,并于1953年三月十七日取得美国专利。格雷码是一个数列集合,相邻两数间只有一个位元改变,为无权数码,且格雷码的顺序不是唯一的。
直接排列
    以二进制为0值的格雷码为第零项,第一项改变最右边的位元,第二项改变右起第一个为1的位元的左边位元,第三、四项方法同第一、二项,如此反覆,即可排列出n个位元的格雷码。

1、自然二进制码转换成二进制格雷码
  自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。



2、二进制格雷码转换成自然二进制码 
  二进制格雷码转换成自然二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。


    二进制数转格雷码
(假设以二进制为0的值做为格雷码的0)
格雷码第n位 = 二进制码第(n+1)位+二进制码第n位。不必理会进制。

     Verilog 代码:gray=(binary>>1)^binary;

     格雷码转二进制数
二进制码第n位 = 二进制码第(n+1)位+格雷码第n位。因为二进制码和格雷码皆有相同位数,所以二进制码可从最高位的左边位元取0,以进行计算。
      verilog 代码://------假设 reg [n-1] gray,binary;
             integer i;
             for(i=0;i<=n-1;i=i+1)
              binary[i]= ^(gray>>i)//gray移位后,自身按位异或
放一段代码这,用于参考:
/*Logic to convert binary numbers into Gray coded binary numbers is implemented in the following Verilog Code.
*/
module binary2gray();
reg clk;
reg rstn;
reg [5:0] counter_binary, counter_binary_reg, counter_gray, counter_gray_reg;
integer count, file_wr;

/* Initial block to generate clock and reset */ 
initial  begin
    clk = 0; rstn = 0;  #100 rstn = 1;
    forever begin
        #10 clk = !clk; 
 end end    

/* Synchronous Logic for registering the data and incrementing the counter for binary data */
always @ (posedge clk or negedge rstn)
begin
    if (!rstn) begin
        counter_binary_reg <= 'b0;
        counter_gray_reg <= 'b0;  end
    else begin 
        counter_binary_reg <= counter_binary + 1;
        counter_gray_reg <= counter_gray;
        $display("binary number= 6'b%b : gray en-coded binary number = 6'b%b", counter_binary_reg, counter_gray_reg);   end end

/* Logic is to get Gray code from Binary code */
function[5:0] binary2gray ;
    input[5:0] value;
    integer i;
    begin 
        binary2gray[5] = value[5];
        for (i=5; i>0; i = i - 1)
            binary2gray[i-1] = value[i] ^ value[- 1];
    end
endfunction

/* Get gray encoded output */
always @(*)
begin 
  counter_gray = counter_gray_reg;
  counter_binary = counter_binary_reg;
  counter_gray = binary2gray(counter_binary_reg); end
endmodule
 

四、奇数分频

奇数分频电路:

  奇数分频电路常用的是错位“异或”法的原理。如进行三分频,通过待分频时钟的上升沿触发计数器进行模三技术,当计数器计数到邻近值进行两次翻转。比如计数器在计数到1时,输出时钟进行翻转,计数到2时再进行翻转,即在邻近的1和2时刻进行两次翻转。这样实现的三分频占空比为1/3或2/3.如果要实现占空比为50%的三分频时钟,可通过待分频的时钟上升沿触发计数器和下降沿触发计数器进行三分频,然后将上升沿和下降沿产生的三分频时钟进行相或预算,即可得到占空比为50%的三分频时钟。

      错位“异或”法推广:

  对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发的模N计数,计数到某一选定值时,进行输出时钟翻转,然后进过(N-1)/2再次进行翻转得到一个占空比非50%的技术分频时钟。再者同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同时,进行输出时钟翻转,同样经过(n-1)/2时,输出时钟再次翻转生成占空比非50%的奇数N分频时钟。两个占空比非50%的时钟相或运算,得到占空比为50%的奇数N分频时钟。

 

### 异或操作 (^) 的含义和用法 #### 定义与基础概念 `^` 符号表示的是异或(XOR)运算符,它是一种按位逻辑运算。对于两个输入值的每一位,如果相同则返回 `0`,不同则返回 `1`[^3]。 #### 基本特性 异或操作具有以下几个重要特性: - **交换律**:`a ^ b = b ^ a` - **结合律**:`(a ^ b) ^ c = a ^ (b ^ c)` - **自反性**:`a ^ a = 0` 和 `a ^ 0 = a` 这些特性使得异或在许多场景下非常有用,尤其是在处理数据时需要消除重复项或者查找唯一项的情况中[^4]。 #### 编程中的应用案例 ##### 查找数组中唯一的数字 假设在一个整型数组中有若干个成对出现的数字以及一个单独出现的数字,可以通过遍历整个数组并对所有元素执行异或操作来找出那个只出现一次的数字。这是因为任何数与其自身做异或都会得到零,而零与任意数做异或会返回该数本身[^4]。 以下是基于此原理的一个 C 实现例子: ```c #include <stdio.h> int findUniqueNumber(int array[], int length){ int result = 0; for(int i=0;i<length;i++){ result ^= array[i]; } return result; } // 测试函数 void test(){ int data[] = {2, 3, 5, 3, 2}; printf("%d\n",findUniqueNumber(data,sizeof(data)/sizeof(*data))); // 输出应为5 } ``` ##### 数据加密解密 由于异或满足可逆性和自身的特殊属性,它可以被用来进行简单的流密码加解密工作。给定明文 P 和随机生成的秘密钥 K ,通过计算 E=P^K 得到密文;接收方再通过对收到的信息 R 应用相同的秘钥K 即可通过 D=R^K=E^K=(P^K)^K=P 来恢复原始消息[^2]。 下面是一个 Python 中使用 XOR 对字符串进行简单加密/解密的例子: ```python def xor_encrypt_decrypt(input_string, key): output = "" for char in input_string: output += chr(ord(char) ^ key) return output message = "hello" key = 7 encrypted_message = xor_encrypt_decrypt(message, key) print(f"Encrypted Message: {encrypted_message}") decrypted_message = xor_encrypt_decrypt(encrypted_message, key) print(f"Decrypted Message: {decrypted_message}") ``` #### Java 中的具体运用说明 在 Java 当中,`^` 同样作为位级上的异或运算符存在。例如当我们要比较两个字节变量是否完全一致而不考虑它们具体数值大小关系的时候就可以采用这种方式来进行判断[^3]。 另外需要注意的一点是在某些情况下可能还需要考虑到正负符号的影响因为最高有效位代表着符号所以可能会引起意想不到的结果因此实际编码过程中应当格外小心对待涉及到带符号类型的位运算[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值