Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在LRU平方算法中,最近使用的最少行是否总是零?_C_Algorithm_Lru - Fatal编程技术网

C 在LRU平方算法中,最近使用的最少行是否总是零?

C 在LRU平方算法中,最近使用的最少行是否总是零?,c,algorithm,lru,C,Algorithm,Lru,我的Hacker's Delight副本在家里,我找到的网络资源对此细节并不清楚 我使用著名的“行-列-平方”算法编写了以下8级LRU。(有更好的名字吗?) #包括 typedef联合{ uint8_t行[8]; uint64_t cols; }卢卢州; 无效lru_init(lru_状态*此){ 这->cols=0; } 无效lru_up(lru_状态*此,在0..7*/中使用的int/*){ 此->行[已使用]=0xff; 这->cols&=~(0x0101010101010101您的假设

我的Hacker's Delight副本在家里,我找到的网络资源对此细节并不清楚

我使用著名的“行-列-平方”算法编写了以下8级LRU。(有更好的名字吗?)

#包括
typedef联合{
uint8_t行[8];
uint64_t cols;
}卢卢州;
无效lru_init(lru_状态*此){
这->cols=0;
}
无效lru_up(lru_状态*此,在0..7*/中使用的int/*){
此->行[已使用]=0xff;

这->cols&=~(0x0101010101010101您的假设是正确的

我们可以用矛盾来证明:

假设LRU候选(具有最多零位的字节)是c,并且在位置x处设置了一个位


这意味着在c行之后没有使用x行,因此x必须具有c所具有的所有零位,再加上x位置的零位。这是一个矛盾,因为c是零位最多的字节,所以我们得出结论,c不能设置任何位。

您的假设是正确的

我们可以用矛盾来证明:

假设LRU候选(具有最多零位的字节)是c,并且在位置x处设置了一个位


这意味着在c行之后没有使用x行,因此x必须具有c所具有的所有零位,加上x位置的零位。这是一个矛盾,因为c是零位最多的字节,所以我们得出结论c不能设置任何位。

注意:您的for循环在
lru_get()
从不测试
行[0]
。这是你的意图还是你希望采用的方法?我只是让它成为一个漏洞。将它向上移动到循环中(没有漏洞)取决于这个问题的答案。我2分钱的专业知识:同意你的断言。可移植性问题:有些机器是大的或小的endian,这会影响功能。一个好的编译器会很好地处理
uint64_t FF=0xff;cols |=FF@chux,你会如何处理lru_get()中的测试?我认为我的版本还可以;只要行[I]=0xff与行[I]在同一字节上运行,我就不关心内存安排。你同意吗?
if(0==(cols&(FF)注意:你的for循环在
lru_get()
从不测试
行[0]
。这是你的意图还是你希望采用的方法?我只是让它成为一个漏洞。将它向上移动到循环中(没有漏洞)取决于这个问题的答案。我2分钱的专业知识:同意你的断言。可移植性问题:有些机器是大的或小的endian,这会影响功能。一个好的编译器会很好地处理
uint64_t FF=0xff;cols |=FF@chux,你会如何处理lru_get()中的测试?我认为我的版本还可以;只要行[I]=0xff与行[I]在同一字节上运行,我就不关心内存安排。你同意吗?
if(0==(cols&(FF))
#include <stdint.h>

typedef union {
  uint8_t rows[8];  
  uint64_t cols;
} lru_state;

void lru_init(lru_state *this) {
  this->cols=0;
}

void lru_up(lru_state *this, int used /* in 0..7 */) {
  this->rows[used]=0xff;
  this->cols &= ~(0x0101010101010101 << used);
}

int lru_get(lru_state *this) {
  int i;
  for (i=1; i<8 ; i++) {
    if (0==(this->rows[i])) return i;
  }
  return 0;
}