c语言中有个很有趣的东西:union,Pascal里有没有呢?
答案是,用absolute关键字可实现类似union的功能,还可有其他用法。
absolute的用法如下:
[变量名] : [类型名] absolute [另一变量名]
absolute只用于var段中,不能用于type段中。所以无法实现c中union的全部,只能实现无名union。不过,absolute变量是可以同时访问的,例如下面这样可以不调用ord和chr转换char和byte:
view plaincopy to clipboardprint?
1.var a:shortint;
2.b:char absolute a;
3.begin
4. a:=97;
5. //b='a';
6. b:='A';
7. //a=65;
8.end.
var a:shortint;
b:char absolute a;
begin
a:=97;
//b='a';
b:='A';
//a=65;
end.
此关键字还有一个妙用——十进制转二进制:
view plaincopy to clipboardprint?
1.var a,i:integer;
2.b:set of 0..15 absolute a;
3.begin
4. read(a);
5. for i:=15 downto 0 do
6. if i in b then write(1) else write(0);
7. writeln;
8.end.
var a,i:integer;
b:set of 0..15 absolute a;
begin
read(a);
for i:=15 downto 0 do
if i in b then write(1) else write(0);
writeln;
end.
这里的原理是什么呢?
这还从set的存储方式说起
因为set的基类型是有序类型,元素个数是一定的,每个值都保存在一个2进制位上,0表示不属于,1表示属于。
[1,2,4..6]在set of 1..10 中存储为:
1 2 3 4 5 6 7 8 9 10
1 1 0 1 1 1 0 0 0 0
那么在上一个程序中,如果a为26542内存中的值为
a 0 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0
b 0 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0
0 1 2 3 4 5 6 7 8 9 101112131415
a=26542
b=[1,2,5..8,10,12..14]
输出为:011001110101110
知道了**和absolute的妙用后,bitset之类的东西也没啥了。
答案是,用absolute关键字可实现类似union的功能,还可有其他用法。
absolute的用法如下:
[变量名] : [类型名] absolute [另一变量名]
absolute只用于var段中,不能用于type段中。所以无法实现c中union的全部,只能实现无名union。不过,absolute变量是可以同时访问的,例如下面这样可以不调用ord和chr转换char和byte:
view plaincopy to clipboardprint?
1.var a:shortint;
2.b:char absolute a;
3.begin
4. a:=97;
5. //b='a';
6. b:='A';
7. //a=65;
8.end.
var a:shortint;
b:char absolute a;
begin
a:=97;
//b='a';
b:='A';
//a=65;
end.
此关键字还有一个妙用——十进制转二进制:
view plaincopy to clipboardprint?
1.var a,i:integer;
2.b:set of 0..15 absolute a;
3.begin
4. read(a);
5. for i:=15 downto 0 do
6. if i in b then write(1) else write(0);
7. writeln;
8.end.
var a,i:integer;
b:set of 0..15 absolute a;
begin
read(a);
for i:=15 downto 0 do
if i in b then write(1) else write(0);
writeln;
end.
这里的原理是什么呢?
这还从set的存储方式说起
因为set的基类型是有序类型,元素个数是一定的,每个值都保存在一个2进制位上,0表示不属于,1表示属于。
[1,2,4..6]在set of 1..10 中存储为:
1 2 3 4 5 6 7 8 9 10
1 1 0 1 1 1 0 0 0 0
那么在上一个程序中,如果a为26542内存中的值为
a 0 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0
b 0 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0
0 1 2 3 4 5 6 7 8 9 101112131415
a=26542
b=[1,2,5..8,10,12..14]
输出为:011001110101110
知道了**和absolute的妙用后,bitset之类的东西也没啥了。