所以我正在尝试编写一个将7位格雷码转换为相应的7位二进制码的函数。
以下是如何转换 -
二进制值位 - MS位> (B6)B5 B4 B3 B2 B1 B0 *
B6 = G6 // MS位始终相同
这是我迄今为止的功能 -
unsigned short Gray_to_Bin(unsigned short Gray)
{
unsigned short Bin;
unsigned short i;
unsigned short mask;
mask = 0x40; // Initial mask
Bin = 0;
Gray &= 0x7f; // Mask bit 7 (Index Bit)
Bin = Gray & mask; // Set B6 = G6
for (i=0; i<6; i++) // Set B5, B4, ..., B0
{
// Code needed here!!
}
return Bin;
}
我需要找到一种方法来为每次循环运行访问所需的特定位...需要以某种方式访问像数组一样的位......
任何想法/指针?谢谢:))
答案 0 :(得分:2)
以下按照您提供的要求实现结果的按位组装..
对于B5,我简单地将B6值右移一位,使其与灰色位G5对应,然后它们通过&
操作滤除其他位。这些按位结果进行OR运算以创建整体结果。重复连续位。它甚至不值得拥有一个循环...只是额外的可能的运行时开销和源代码复杂性。
unsigned short gray_to_binary(unsigned short gray)
{
unsigned short result = gray & 64;
result |= (gray ^ (result >> 1)) & 32;
result |= (gray ^ (result >> 1)) & 16;
result |= (gray ^ (result >> 1)) & 8;
result |= (gray ^ (result >> 1)) & 4;
result |= (gray ^ (result >> 1)) & 2;
result |= (gray ^ (result >> 1)) & 1;
return result;
}
答案 1 :(得分:1)
我知道的将格雷码转换为二进制代码的最快方法是实现以下Java方法:
private static int grayToBin(int gray) {
int bin = 0;
while (gray != 0) {
int decremented = gray - 1;
bin ^= gray;
bin ^= decremented;
gray &= decremented;
}
return bin;
}
答案 2 :(得分:1)
将灰阶转换为binay的更优化的代码将会
int grayToBinary(int gray)
{
int binary=0;
for(;gray;gray=gray>>1)
{
binary^=gray; //binary=binary^gray;
}
return binary;
}
此技术使用按位运算符。
答案 3 :(得分:0)
你在问题中所写的问题是什么问题我的意思是在你的陈述中你可以写B[i] = B[i+1]^G[i];
你必须改变你的所以它从4 downto零开始
答案 4 :(得分:0)
以下代码可以解决这个问题:
for (int i = 0; i < 6; ++ i) {
unsigned short j = 5 - i;
unsigned short m = 1 << j;
Bin |= ((Bin >> 1) & m) ^ (Gray & m);
}
答案 5 :(得分:0)
我认为它应该是这样的:
for(i=5; i >= 0; i--){
Bin = Bin | ((Gray & 1<<i)>>i ^ (Bin & 1<<(i + 1))>>i)<<i;
}
要访问特定位,使用1<<i
左移“1”i次,产生一个全零的数字,除了右边第i个位置的数字。这可以与Gray或Bin进行AND运算,将除了我们关心的所有位置零。然后使用>>i
右移结果,将我们关心的位移到最右边。我们使用^来对这两个位进行xor,然后将其向左移动到结果位所属的位置,或者将它向内移位Bin。
This给出了一个非常有用的解释。
答案 6 :(得分:0)
几乎任何七位代码转换为另一种代码, 最简单的解决方案只是一个表,例如: static unsigned char fromGray [] = { 0x00,0x01,0x03,0x02,0x06,0x07,0x05,0x04, 0x0C,0x0D,0x0F,0x0E,0x0A,0x0B,0x09,0x08, 0x18,0x18,0x1B,0x1A,0x1E,0x1F,0x1D,0x1C, 0x14,0x15,0x17,0x16,0x12,0x13,0x11,0x10, // .... };
在8到16位之间的某个时刻,你可能会想要 转向算法方法(虽然给出了记忆 在现代处理器上可用,表格方法是有效的 相当大的表)。即便如此,我也许会使用这张桌子 低阶位。