کد گری کیست؟ توضیح بده.
نمایش کدهای دودویی که بعد از فرانک گری (Frank Gray) به نام کد گِرِی شناخته شد، یک سیستم از اعداد دودویی است که هر دو عدد متوالی فقط در یک بیت با هم اختلاف داشته باشند.امروزه کدگری به طورِ گسترده برای تصحیحِ اشکالات در سیستم ارتباط دیجیتالی مثل تلویزیون کابلی و تلویزیون دیجیتال استفاده می‌شود.نام.یکی از محققان آزمایشگاه بل (Bell) به نام فرانک گری اولین بار به‌طور رسمی کد گری را مورد استفاده قرار داد و این کد بعد از گری توسط افرادی که از آن استفاده می‌کردند کد گری نامگذاری شد.تاریخچه و کاربردهای علمی.کد گری قبل از آن که در مهندسی به کار رود در پازل‌های ریاضی به کار برده می‌شد، ریاضیدان فرانسوی "Emile Boudat" از کد گری در سال ۱۸۷۸در تلگراف استفاده کرد و برای این کارش مدال دریافت کرد.و اما کاربردهای آن، از کد گری به عنوان یک رمزگذار استفاده می‌شود که نسبت به رمزگذار عادی برتری دارد.در نمایش کد گری خاصیت دایره‌ای بودن آن باعث می‌شود که دو عدد دو سر نیز فقط در یک بیت متفاوت باشند.کد گری یک دور همیلتونی در یک مکعب formula_1 بعدی formula_2 تولید می‌کند که هر کدام از اعداد آن یک راس را نشان می‌دهد و نیز در الگوریتم‌های ژنتیکی از آن استفاده می‌شود و البته برچسب گذاری جدول کارنو از موارد دیگر استفاده آن است.زمانی کد گری برای آدرس دهی حافظه در کامپیوتر استفاده می‌شود، کامپیوتر نیروی کمتری صرف یافتن آدرس‌ها می‌کند چون هر آدرس با قبلی فقط در یک بیت متفاوت است.طراحان مدارهای منطقی از کد گری به‌طور گسترده برای عبور چند بیت اطلاعات بین سیستم‌های همزمان استفاده می‌کنند.انگیزهٔ پیدایش کد گری.بعضی از دستگاه‌ها وضعیت دستگاه را با کدهای باینری نمایش می‌دهند، اگر این دستگاه‌ها از کد باینری عادی استفاده کند این دو وضعیت پشت سر هم خواهند بود۰۱۱۱۰۰...و مشکل کد باینری عادی این است که در حالت طبیعی خیلی بعید است که چند بیت همزمان تغییر کنند همان‌طور که در بالا نمایش داده شده‌است که در کد باینری عادی هر سه بیت همزمان تغییر کرده‌اند اما می‌توان اعداد را طوری در کنار هم قرار داد که فقط در یک بیت متفاوت باشند و تغییر زیادی نکنند مثلformula_3پس کد باینری منعکس شده یا همان کد گری این مشکل را حل می‌کند زیرا که فقط یک بیت در آن‌ها تغییر می‌کند. Gray Binary۰ ۰۰۰ ۰۰۰۱ ۰۰۱ ۰۰۱۲ ۰۱۱ ۰۱۰۳ ۰۱۰ ۰۱۱۴ ۱۱۰ ۱۰۰۵ ۱۱۱ ۱۰۱۶ ۱۰۱ ۱۱۰۷ ۱۰۰ ۱۱۱با توجه به حالت ۷ و ۰ می‌بینیم که فقط در یک بیت تفاوت دارند که همان خاصیت دوره‌ای یا چرخشی بودن کد گری می‌گوییم.ساختن کد گری formula_1 بیتی.یک کد گری formula_1 بیتی را می‌توان به صورت بازگشتی تولید کرد، به این شکل که یک لیست formula_6 بیتی داریم آن را وارونه می‌کنیم (خط افقی در شکل زیر مانند آینه عمل کند) و در انتهای لیست اصلی می‌چسبانیم و سپس در ابتدای لیست اول formula_7 و در ابتدای لیست دوم formula_8 قرار می‌دهیم مثلاً برای کد گری یک بیتی ، formula_9 را داریم (البته می‌توان از کد گری formula_7 بیتی هم استفاده کرد). formula_11، و بعد با آن کد گریformula_8 بیتی را به صورت بازگشتی بسازیم و اکنون شبه کد آن را داریم.الگوریتم کد گری.ابتدا یک الگوریتم برای تبدیل کد باینری عادی به کد گری وجود دارد.۱ Let B[n:0] be the input array of bits in the usual binary representation, [0] being LSB۲ Let G[n:0] be the output array of bits in Gray code۳ G[n] = B[n]۴ for i = n-1 downto 0۵ G[i] = B[i+1] XOR B[i]الگوریتم تبدیل کد گری به کد باینری.۱ Let G[n:0] be the input array of bits in Gray code۲ Let B[n:0] be the output array of bits in the usual binary representation۳ B[n] = G[n]۴ for i = n-1 downto 0۵ B[i] = B[i+1] XOR G[i]الگوریتم تبدیل کد باینری به گری.اول از همه کد باینری عدد مورد نظر را می‌نویسیمسپس از سمت چپ شروع می‌کنیم و اولین عدد را همان‌طور که هست نوشته سپس دوتا دوتا عددها رو مقایسه می‌کنیم، اگر هردو یکسان باشند در این صورت به جای آن دو عدد صفر می‌گذاریم، در غیر این صورت: یعنی اگر یکی از عددها صفر و دیگری یک باشد، آن وقت به جای آن دو عدد یک را به جای آنها می‌نویسیمبرای مثال۷ باینری» ۱ ۱ ۱ ۰۷ گری» ۰ ۰ ۱ ۰یک الگوریتم سریع درC/java به شکل زیر است.۱ long inverseGray(long n) {۲ long ish, ans, idiv;۳ ish = ۱;۴ ans = n;۵ while(true) {۶ idiv = ans» ish;۷ ans ^= idiv;۸ if (idiv &lt;= ۱ || ish == ۳۲)۹ return ans;کد گری n تایی.انواع مختلفی از کد گری وجود دارد که یی از این انواع مختلف کد گری n تایی است که به عنوان کد گری غیر دوتایی (۰و۱)هم شناخته می‌شود یعنی به غیر از ۰ و ۱ از اعداد دیگر هم استفاده می‌شود (همان‌طور که نام آن نشان می‌دهد) و در رمزگذاری هم از آن استفاده می‌شود.برای مثال یک کد گری سه تایی از بیت‌های {۰و۱و۲} استفاده می‌کند.کد گری سه تایی،۰۰۰،۰۰۱،۰۰۲،۰۱۲،۰۱۱،۰۱۰،۰۲۰،۰۲۱،۰۲۲،۱۲۲،۱۲۱،۱۲۰،۱۱۰،۱۱۱،۱۱۲،۱۰۲،۱۰۱،۱۰۰،۲۰۰،۲۰۱،۲۰۲،۲۱۲،۲۱۱،۲۱۰،۲۲۰،۲۲۱،۲۲۲یک کد گری (n,k)تایی یک کد گری n تایی است که دارای k بیت است مثلاً یک کد گری(۲و۳)برابر است باو اکنون الگوریتم ساخت کد گری (n,k) در C/java در زیر آمده‌استint n[k+1]; // stores the maximum for each digitint g[k+1]; // stores the Gray codeint u[k+1]; // stores +1 or -1 for each elementint i, j;// initialize valuesfor(i = ۰; i &lt;= k; i++) {g[i] = ۰;u[i] = ۱;n[i] = N;// generate codeswhile(g[k] == ۰) {// at this point (g[۰]... ,g[k-1]) hold a subsequent element of the (N,k)-Gray codei = ۰;j = g[۰] + u[0];while((j&gt;= n[i]) || (j &lt;۰)) {u[i] = -u[i];i++;j = g[i] + u[i];g[i] = j;اما یادآور می‌شویم که کد گری (n,k)تایی برای nهای فرد خاصیت چرخشی را حفظ نمی‌کنند ولی برای nهای زوج خاصیت چرخشی را حفظ می‌کنند.