一个整数的范围为:0~64*1024*1024=67108864,表示为整数应是Longint吧?
如何把它转为二进制字符串?用InttoHex只能转为十六进制,并且InttoHex
是作用在Integer上的呀?我现在需要将一个0~64*1024*1024=67108864之间的整数转化为二进制数
(0、1字符串),然后分别抽出该二进制字符串的前面几位和中间几位,再分别转
化为十进制整数,不知道怎么做,求救,谢谢!!!学计算机的兄弟应该知道,当主存地址用二进制表示时,
这前面几位是主存块地址的标识(tag)部分,
中间几位是主存块地址的索引(index)部分,
如何把它转为二进制字符串?用InttoHex只能转为十六进制,并且InttoHex
是作用在Integer上的呀?我现在需要将一个0~64*1024*1024=67108864之间的整数转化为二进制数
(0、1字符串),然后分别抽出该二进制字符串的前面几位和中间几位,再分别转
化为十进制整数,不知道怎么做,求救,谢谢!!!学计算机的兄弟应该知道,当主存地址用二进制表示时,
这前面几位是主存块地址的标识(tag)部分,
中间几位是主存块地址的索引(index)部分,
你就是要把它分成几段是吧,传换成二进制串就多此一举了。var
Addr,Part0, Part1, Part2: integer;begin
Addr := $1111111; Part0 := Addr shr 20;
Part1 := (Addr shr 10) and $3FF;
Part2 := Addr and $3FF;
end;
用2除总是行的
我看得不太懂,比如主存地址56326985,是不能将563看成标识(tag)部分,将269看成索引(index)部分的,必须把它转化为二进制数,假设为11010100100110101010111011,且假设
标识(tag)部分占8位,索引(index)部分占6位,则将11010100转为十进制数来对应标识(tag)部分,将100110转为十进制数来对应索引(index)部分,不知道我是不是对你的代码理解有误?
比如按某个地址访Cache,第一次会失效,这时要放主存,读入块,并把tag保存,下一次再按这个地址访Cache,则通过比较tag会发现有匹配的块(如果这个地址所在的块未被替换掉),不必再访存。总之最好要把地址有十进制转二进制,再转回来,大家说怎么做?
如:
$4567,你想得到$4500,->$4567 and $FF00就可以了,自己试试先。
delphi的帮助很好用,你在编辑器中点一下and,按F1键就出来了!
var i:Cardinal;
s:string;
begin
i:=67108864;
s:=IntToBin(i); //返回32位的'0'或'1'字符串
while s[1]='0' do //该循环将前面的没有的0去掉。
begin
delete(s,1,1);
end;
showmessage(s); //返回100000000000000000000000000(26个0)
end;
作为程序员,理解数据在内存中的存储格式是非常重要的。程序无非就是对一些数据做处理并产生输出,如果对数据的存储格式都不能理解,如何能够处理好数据呢?高级语言中的数据在计算中的存储格式全部都是二进制的!在上面的题目中,还有必要把一个integer(就是longint)转换成二进制串吗?完全没有必要。
取第1位 (x and 2) shr 1
取第2位 (x and 4) shr 2
取第3位 (x and 8) shr 3
.....取后1位 x and 1 //2-1
取后2位 x and 3 //4-1
取后2位 x and 7 //8-1
取后4位 x and 15 //16-1
.....想怎么取就怎么取!
Easy!!!
function bintoint(s:string):integer;
var
j,i:integer;
begin
result:=0;
if s='' then
begin
result:=-1;
exit;
end;
for i:=length(s) downto 1 do
begin
j:=1;
j:=j shl (length(s)-i);
if s[i]='1' then
result:=result or j
else if s[i]='0' then
result:= result and (not j)
else
begin
result:=-1;
exit;
end;
end;
end;function inttobin(i:integer;size:integer):string;
var
j: integer;
begin
result:='';
for j:=size-1 downto 0 do
begin
if i and (1 shl j)<>0 then
result:=result+'1'
else
result:=result+'0';
end;
end;关于从字符串中截取字几个符,用Copy就OK了,试一试吧,GoodLuck!