我正在做一些集合操作,结果是一个包含(为了简化)单个整数的集合。如何将集合转换回 uint?目前我正在做这样的事情:
var my_set: set = [3];
var my_int: uint;
for i from 0 to MAX_UINT {
if i in my_set { my_int = i; break };
};
print my_int; // should print "3"
我正在使用 Specman 13.1。
我正在做一些集合操作,结果是一个包含(为了简化)单个整数的集合。如何将集合转换回 uint?目前我正在做这样的事情:
var my_set: set = [3];
var my_int: uint;
for i from 0 to MAX_UINT {
if i in my_set { my_int = i; break };
};
print my_int; // should print "3"
我正在使用 Specman 13.1。
我有一个基于正则表达式的解决方案。由于字符串匹配,它可能会更慢,但对于小间隔,它实际上可能更快:
extend sys {
run() is also {
var my_1set : set = [1..5];
var my_2set : set = [3..7, 10..13];
var my_3set : set = [1..5,7..10,20..25];
print convert_set(my_1set);
print convert_set(my_2set);
print convert_set(my_3set);
};
convert_set(my_set : set) : list of int is {
var my_set_as_string := my_set.to_string();
while TRUE {
// split it using regexps - should always match
assert str_match(my_set_as_string, "/(\d+\.\.\d+)(.*)/");
result = { result; generate_ints($1) };
if $2 == "]" {
break;
};
my_set_as_string = $2;
};
};
generate_ints(interval : string) : list of int is {
assert str_match(interval, "/(\d+)\.\.(\d+)/");
for i from $1.as_a(int) to $2.as_a(int) {
result = { result; i };
};
};
};
这也不适用于当前形式的所有整数(仅适用于无符号整数),但这只是调整正则表达式的问题。您可以检查一下,看看它是否足够快。如果是这样,我们/您可以调整正则表达式以同样适用于负整数。
我不熟悉任何内置解决方案,但您可以使用二进制搜索来查找O(log(n))而不是O(n)中的值:
var s: set = [1884667];
var curr_min : uint = 0;
var curr_max : uint = MAX_UINT;
var pivot : uint;
var curr_set : set;
var done : bool = FALSE;
while (!done) {
pivot = (curr_max + curr_min) / 2;
curr_set = [curr_min..pivot];
if (s in curr_set) {
curr_max = pivot;
} else {
curr_min = pivot;
};
if (curr_min == curr_max ||
curr_min + 1 == curr_max) {
done = TRUE;
};
};
print curr_max;
基于此,编写一个递归函数非常简单,该函数在集合不是单例的情况下返回集合中的所有值。