کد گری

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

نمایش کدهای دودویی که بعد از فرانک گری (Frank Gray) به نام کد گری شناخته شد که یک سیستم از اعداد دودویی است که هر دو عدد متوالی فقط در یک بیت با هم اختلاف داشته باشند. امروزه کد‌گری به طور گسترده برای تصحیح اشکالات در سیستم ارتباط دیجیتالی مثل کابل‌های تلویزیونی و تلویزیون‌های دیجیتالی جهانی استفاده می‌شود.

نام[ویرایش]

یکی از محققان آزمایشگاه بل (Bell) به نام فرانک گری اولین بار به طور رسمی کد گری را مورد استفاده قرار داد و این کد بعد از گری توسط افرادی که از آن استفاده می‌کردند کد گری نامگذاری شد.

تاریخچه و کاربردهای علمی[ویرایش]

کد گری قبل از آن که در مهندسی به کار رود در جدول‌ها پازل‌های ریاضی به کار برده می‌شد، ریاضیدان فرانسویEmile Boudat از کد گری.در سال۱۸۷۸در تلگراف استفاده کرد و برای این کارش مدال دریافت کرد.

و اما کاربردهای آن، از کد گری به عنوان یک رمزگذار استفاده می‌شود که نسبت به رمزگذار عادی برتری دارد.

در نمایش کد گری خاصیت دایره‌ای بودن آن باعث می‌شود که دو عدد دو سر نیز فقط در یک بیت متفاوت باشند.

کد گری یک دور همیلتونی در یک مکعب n بعدی Q_n تولید می‌کند که هر کدام از اعداد آن یک راس را نشان می‌دهد و نیز در الگوریتم‌های ژنتیکی از آن استفاده می‌شود و نیز البته برچسب گذاری جدول کارنو از موارد دیگر استفاده آن است.

زمانی کد گری برای آدرس دهی حافظه در کامپیوتر استفاده می‌شود کامپیوتر نیروی کمتری صرف یافتن آدرس‌ها می‌کند چون هر آدرس با قبلی فقط در یک بیت متفاوت است.

طراحان مدارهای منطقی از کد گری به طور گسترده برای عبور چند بیت اطلاعات بین سیستم‌های همزمان استفاده می‌کنند.

Encoder Disc (3-Bit).svg

انگیزهٔ پیدایش کد گری[ویرایش]

بعضی از دستگاه‌ها وضعیت دستگاه را با کدهای باینری نمایش می‌دهند، اگر این دستگاه‌ها از کد باینری عادی استفاده کند این دو وضعیت پشت سر هم خواهند بود

..

۰۱۱

۱۰۰...

و مشکل کد باینری عادی این است که در حالت طبیعی خیلی بعید است که چند بیت همزمان تغییر کنند همان طور که در بالا نمایش داده شده‌است که در کد باینری عادی هر سه بیت همزمان تغییر کرده‌اند اما می‌توان اعداد را طوری در کنار هم قرار داد که فقط در یک بیت متفاوت باشند و تغییر زیادی نکنند مثل011-001-101-100 پس کد باینری منعکس شده یا همان کد گری این مشکل را حل می‌کند زیرا که فقط یک بیت در آن‌ها تغییر می‌کند.

Gray Binary


۰ ۰۰۰ ۰۰۰
۱ ۰۰۱ ۰۰۱
۲ ۰۱۱ ۰۱۰
۳ ۰۱۰ ۰۱۱
۴ ۱۱۰ ۱۰۰
۵ ۱۱۱ ۱۰۱
۶ ۱۰۱ ۱۱۰
۷ ۱۰۰ ۱۱۱


با توجه به حالت ۷ و ۰ می‌بینیم که فقط در یک بیت تفاوت دارند که همان خاصیت دوره‌ای یا چرخشی بودن کد گری می‌گوییم.

ساختن کد گریn بیتی[ویرایش]

یک کد گریn بیتی را می‌توان به صورت بازگشتی تولید کرد به این شکل که یک لیست n-1 بیتی داریم آن را وارونه می‌کنیم (خط افقی در شکل زیر مانند آینه عمل کند) و در انتهای لیست اصلی می‌چسبانیم و سپس در ابتدای لیست اول 0 و در ابتدای لیست دوم 1 قرار می‌دهیم مثلاً برای کد گری یک بیتی ، G={0,1} را داریم (البته می‌توان از کد گری 0 بیتی هم استفاده کرد). n=0 ,G={0,1}، و بعد با آن کد گری1 بیتی را به صورت بازگشتی بسازیم و اکنون شبه کد آن را داریم.

Gray code reflect.png

الگوریتم کد گری[ویرایش]

ابتدا یک الگوریتم برای تبدیل کد باینری عادی به کد گری وجود دارد.

۱ Let B[n:۰] be the input array of bits in the usual binary representation, [۰] being LSB
۲ Let G[n:۰] be the output array of bits in Gray code
۳ G[n] = B[n]
۴ for i = n-۱ downto ۰
۵ G[i] = B[i+۱] XOR B[i]

و اکنون یک الگوریتم برای تبدیل کد گری به کد باینری

۱ Let G[n:۰] be the input array of bits in Gray code
۲ Let B[n:۰] be the output array of bits in the usual binary representation
۳ B[n] = G[n]
۴ for i = n-۱ downto ۰
۵ B[i] = B[i+۱] 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 <= ۱ || ish == ۳۲)
۹ return ans;
۱۰ ish <<= ۱; // double number of shifts next time}
}

کد گری n تایی[ویرایش]

انواع مختلفی از کد گری وجود دارد که یی از این انواع مختلف کد گری n تایی است که به عنوان کد گری غیر دوتایی (۰و۱)هم شناخته می‌شود یعنی به غیر از ۰ و ۱ از اعداد دیگر هم استفاده می‌شود(همان طور که نام آن نشان می‌دهد)و در رمزگذاری هم از آن استفاده می‌شود. برای مثال یک کد گری سه تایی از بیت‌های {۰و۱و۲} استفاده می‌کند. کد گری سه تایی

,۰۰۰ ,۰۰۱ ,۰۰۲ ,۰۱۲ ,۰۱۱ ,۰۱۰ ,۰۲۰ ,۰۲۱ ,۰۲۲ ,۱۲۲ ,۱۲۱ ,۱۲۰ ,۱۱۰ ,۱۱۱ ,۱۱۲ ,۱۰۲ ,۱۰۱ ,۱۰۰ ,۲۰۰ ,۲۰۱ ,۲۰۲ ,۲۱۲ ,۲۱۱ ,۲۱۰ ,۲۲۰ ,۲۲۱ ,۲۲۲

یک کد گری (n,k)تایی یک کد گری n تایی است که دارای k بیت است مثلاً یک کد گری(۲و۳)برابر است با {۰۰, ۰۱, ۰۲, ۱۲, ۱۱, ۱۰, ۲۰, ۲۱, ۲۲} و اکنون الگوریتم ساخت کد گری (n,k) در C/java در زیر آمده‌است


int n[k+۱]; // stores the maximum for each digit
int g[k+۱]; // stores the Gray code
int u[k+۱]; // stores +۱ or -۱ for each element
int i, j;
// initialize values
for(i = ۰; i <= k; i++) {
g[i] = ۰;
u[i] = ۱;
n[i] = N;
}
// generate codes
while(g[k] == ۰) {
// at this point (g[۰],...,g[k-۱]) hold a subsequent element of the (N,k)-Gray code
i = ۰;
j = g[۰] + u[۰];
while((j >= n[i]) || (j < ۰)) {
u[i] = -u[i];
i++;
j = g[i] + u[i];
} g[i] = j;
}


اما یادآور می‌شویم که کد گری (n,k)تایی برای n‌های فرد خاصیت چرخشی را حفظ نمی‌کنند ولی برای nهای زوج خاصیت چرخشی را حفظ می‌کنند.

پیوند بیشتر[ویرایش]

منابع[ویرایش]