TDD (练习) Gray Code 格雷码和二进制 Binary 互转

题目

Create functions to encode a number to and decode
a number from Gray code. Display the normal binary
representations, Gray code representations, and
decoded Gray code values for all 5-bit binary
numbers (0-31 inclusive, leading 0's not necessary).

There are many possible Gray codes. The following
encodes what is called "binary reflected Gray code."

Encoding (MSB is bit 0, b is binary, g is Gray code):
if b[i-1] = 1
g[i] = not b[i]
else
g[i] = b[i]

Decoding (MSB is bit 0, b is binary, g is Gray code):
b[0] = g[0]

for other bits:
b[i] = g[i] xor b[i-1]

背景

典型的二进制格雷码(Binary Gray Code)简称格雷码,因1953年公开的弗兰克·格雷(Frank Gray,18870913-19690523)专利“Pulse Code Communication”而得名,当初是为了通信,现在则常用于模拟-数字转换和位置-数字转换中。法国电讯工程师波特(Jean-Maurice-Émile Baudot,18450911-19030328)在1880年曾用过的波特码相当于它的一种变形。1941年George Stibitz设计的一种8元二进制机械计数器正好符合格雷码计数器的计数规律。

二进制码→格雷码 说明

此方法从对应的n位二进制码字中直接得到n位格雷码码字,步骤如下:

  1. 对n位二进制的码字,从右到左,以0到n-1编号

  2. 如果二进制码字的第i位和i+1位相同,则对应的格雷码的第i位为0,否则为1(当i+1=n时,二进制码字的第n位被认为是0,即第n-1位不变) [4]

公式表示

image
(G:格雷码,B:二进制码)

关注点:

  • 顺序是右到左,和我们通常使用的序号是反的。
  • 第n-1位不变,比如 011 0是第n-1位,第n位认为是0,相当于在前面加了0变成 0011,0和 0 or 1 异或不会改变原来的值。
    输入 - B : 011 转换 过程 1^1 =1 1^0=0 0^0=0(第n-1位不变) 输出 G : 010

格雷码→二进制码 说明

从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)。依次异或,直到最低位。依次异或转换后的值(二进制数)就是格雷码转换后二进制码的值。

公式表示

image

(G:格雷码,B:二进制码)

关注点

  • 顺序不变, n-1不变。b[n-1] 异或 g[n-2] = b[n-2] 以此类推到第0位。
  • 输入G: 111 b[n-1] = g[n-1] b[n-2] = b[n-1] 异或 g[n-2] 输出 B: 101

测试代码

public class GrayCodeTest {

    @Test
    public void should_001_encode_001(){
        String input="001";
        String except ="001";
        String result = GrayCode.encode(input);
        assertEquals(except,result);
    }

    @Test
    public void should_010_encode_011(){
        String input="010";
        String except ="011";
        String result = GrayCode.encode(input);
        assertEquals(except,result);
    }
    @Test
    public void should_0111_encode_0100(){
        String input="0111";
        String except ="0100";
        String result = GrayCode.encode(input);
        assertEquals(except,result);
    }

    @Test
    public void should_0100_decode_0111(){
        String input="0100";
        String except ="0111";
        String result = GrayCode.decode(input);
        assertEquals(except,result);
    }
    @Test
    public void should_100_decode_111(){
        String input="100";
        String except ="111";
        String result = GrayCode.decode(input);
        assertEquals(except,result);
    }
    @Test
    public void should_001_decode_001(){
        String input="001";
        String except ="001";
        String result = GrayCode.decode(input);
        assertEquals(except,result);
    }

}

实现代码

public class GrayCode {

    public static String encode(String input) {
        int len = input.length();
        String[] result = new String[len];

        for (int i = len-1; i>0 ; i--) {
            result[i]=String.valueOf(input.charAt(i)^input.charAt(i-1));
        }
        result[0]=String.valueOf(input.charAt(0));
        return String.join("",result);
    }

    public static String decode(String input) {

        int len = input.length();
        String[] result = new String[len];

        for (int i = 0; i<=len-1 ; i++) {
            if(i==0){
                result[i] = String.valueOf(input.charAt(0));
            }else {
                result[i] = String.valueOf(result[i-1].charAt(0)^input.charAt(i));
            }
        }
        return String.join("",result);

    }
}

Gray Code 理解如何转码编码需要花些时间,实现代码并不复杂。写代码就是需要理解问题,通常需要手工实现然后代码实现。

参考
格雷码(Gray)和二进制(Binary)之间的相互转换
百度百科-格雷码

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容