2016-05-13 30 views
0

我正在研究一个无向图问题。我想计算两个相邻顶点的单个数字并将其存储到数组中。当从数组中读取数据时,我想提取两个原始顶点键,所以我可以说顶点1邻接顶点2和顶点2邻点顶点1.例如: 顶点1邻点顶点2 - >存储某个值捕获这个关系 - >读取该数字 - >打印顶点1,打印顶点2哈希值 - 解码用于生成它的两个值

当前我使用以下函数(x =顶点1,y =顶点2)。我需要满足上述要求的解码功能。那可能吗 ?

// converts pair (x, y) to single integer value 
long code(int x, int y) { 
    return ((1L * x) << 32) | y; // original 
} 

感谢

鲁珀特

+0

语言是Java –

回答

0

注意,你将有一个问题,如果y为负。按位或操作将用全1位覆盖编码的x。您应该逐位,并在按位或结果前使用0xFFFFFFFF

// converts pair (x, y) to single integer value 
long code(int x, int y) { 
    return ((1L * x) << 32) | ((1L * y) & 0xFFFFFFFF); 
} 
  • y可以从value & 0xFFFFFFFF
  • x回收可以从value >> 32

static long encodeXY(int x, int y) { 
    return ((1L * x) << 32) | ((1L * y) & 0xFFFFFFFF); 
} 

static int decodeY(long value) { 
    return (int)(value & 0xFFFFFFFF); 
} 

static int decodeX(long value) { 
    return (int)(value >> 32); 
} 

测试用例被回收

Try it here

如果您需要恢复负数,则y值需要进行特殊处理。如果第31位被设置,那么你应该按位或y0xFFFFFFFF00000000,假设你保留它long。这被称为sign-extension

+0

不幸与此我不能恢复ÿ:(也许我代码错误地进行解码: “代码 INT解码(长码){ 长Y =代码&0xFFFFFFFF的; 长×=代码>> 32; return 0; } –

+0

我添加了一个实现 – doug65536

+0

非常感谢! –