你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【1.7签到】用异或运算,可用于实现那些运算功能?    关闭

[复制链接]
苏柚 提问时间:2016-1-7 08:37 /
收藏 评论112 发布时间:2016-1-7 08:37
112个回答
wudianjun2001 回答时间:2016-1-7 08:39:43
我现在发现在即啥都不会
回答时间:2016-1-7 17:16:48
一、交换两个整数的值而不必用第三个参数
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[i - 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分频时钟。
党国特派员 回答时间:2016-1-7 09:33:24
1、交换两个整数的值而不必用第三个参数
2、奇偶判断
3、格雷码和二进制之间的转换
4、实现加法运算 blank.png blank1.png blank2.png blank3.png blank4.png
wolfgang 回答时间:2016-1-7 12:28:40
本帖最后由 wolfgang2015 于 2016-1-7 14:11 编辑

用异或运算,可用于实现那些运算功能?

半加运算:  异或也叫半加运算,其运算法则相当于不带进位的二进制加法;
多项式除法运算:  CRC校验计算
交换两个变量的值:   a(1)=a^b;  b=b^a(1); a(2)=a(1)^b(1);
yongjun 回答时间:2016-1-7 08:42:02
自己的问题被采用了,感觉良好
wyxy163@126.com 回答时间:2016-1-7 08:43:12
提示: 作者被禁止或删除 内容自动屏蔽
皈依 回答时间:2016-1-7 08:46:11
制作比较器 反相器 都可以的~
anny 回答时间:2016-1-7 08:47:00
异或运算每次写程序必须用到,如下:
51为例简单点啊
sbit Run_led=P1^1;
Run_led^=1;
火蒂树 回答时间:2016-1-7 08:47:12
这是让回答什么? 真值表么?

输入  输出
0 0     0
0 1     1
1 0     1
1 1     0

可用于表达 "两输入不同", 或者表达不带进位的加法
大禹 回答时间:2016-1-7 08:49:02
两个输入相同时为0,不同则为1
alvin_ 回答时间:2016-1-7 08:49:14
我来看跟帖的……
斜阳 回答时间:2016-1-7 08:54:17
今天来混个签到奖励。异或门可作为一个1位加法器
ersha4877 回答时间:2016-1-7 08:57:25
yanhaijian 回答时间:2016-1-7 08:58:00
天天签到。
jundao721 回答时间:2016-1-7 08:58:40
知道但用的少,翻了翻,用于数据交换的居多
烟花绽放 回答时间:2016-1-7 08:59:52
与其它语言不同,C语言和C++语言的异或不用xor,而是用"^",

若需要交换两个变量的值,除了通常使用的借用中间变量进行交换外,还可以利用异或,仅使用两个变量进行交换,如:


adlu 回答时间:2016-1-7 09:01:27
两输入异或门,一端接1,另一端作输入,可实现非门
creep 回答时间:2016-1-7 09:03:49
加密                        

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版