(一个WORD类型$XXXX and $f800) shr 11等于 23 怎么求得这个$XXXX? ( 积分: 300 )

  • 主题发起人 主题发起人 冰力不足
  • 开始时间 开始时间

冰力不足

Unregistered / Unconfirmed
GUEST, unregistred user!
(一个WORD类型$XXXX and $f800) shr 11等于 23
怎么求得这个$XXXX?
谢谢!

补充:
我想我没有表达得清楚,现重新整理:

procedure TForm1.Button2Click(Sender: TObject);
var
w: word;
v:integer;
begin
w := $B921;
v := (w and $f800) shr 11;
Memo1.Lines.Add(inttostr(v)); //23
end;

现在,已知v等于23,而且w和v之间有 v = (w and $f800) shr 11 的关系,
我怎么把w的$后面两个字'B9'求出来?
十分感谢大家指点.
 
var
w: word;
begin
w := 23 shl 11;
caption:=inttohex(w,4);//B800
end;
注意:$B800 仅仅是一个可能的答案,答案很多。
 
谢谢 kaida,
B800刚好是我要的一个中间答案 但是B800好象是(一个WORD类型$XXXX and $f800)的结果 还没有推出这个我要找的终极答案$XXXX

在网上看到的:
GetDateAndTime ( Pathname , DateWord , TimeWord);
If( DateWord<> 0) Then
72页
Begin
{ Decode date}
Year :=( ( DateWord AND $FE00) SHR 9) +1980;
Month:=(DateWord AND $01E0)SHR 5 ;
Day :=(DateWord AND $001 F);
{ Decode time}
Hours:=( TimeWord AND $F800) SHR 11 ;
Mins :=( TimeWord AND $07E0) SHR 5 ;
Secs :=(TimeWord AND $001 F) SHL 1 ; { Shift left to double}
WriteLn(' File Time:' , Hours : 2,' :' , Mins :02,':',Secs:2);
Writeln(' File Date:' , Year:4,' /' , Month:02,'/' , Day:2);
End { No semicolon before EIse}
Else
Writeln(' GetDate And Time has failed!');
End

我的意思就是要反推这个Hours 已知Hours,逆推TimeWord,有办法做到吗?

假使已知现在时间是2007 8月 18 日 23:30 21秒 我怎么逆推出这个16进制的TimeWord?

谢谢!
 
procedure TForm1.Button1Click(Sender: TObject);
var
Secs, Mins, Hours, TimeWord: word;
begin
Secs := 21;
Mins := 30;
Hours:= 23;
TimeWord := (Secs shr 1) or (Mins shl 5) or (Hours shl 11);
Hours := (TimeWord and $F800) shr 11;
Mins := (TimeWord and $07E0) shr 5;
Secs := (TimeWord and $001F) shl 1; //还原的秒数 = 原来的秒数 - (原来的秒数 mod 2) 从加密中的Shr 1可以看出
Caption := Format('%d[%d:%d %d'']', [TimeWord, Hours, Mins, Secs]);
end;
 
谢谢Miros 我想我没有表达得清楚,现重新整理:

procedure TForm1.Button2Click(Sender: TObject);
var
w: word;
v:integer;
begin
w := $B921;
v := (w and $f800) shr 11;
Memo1.Lines.Add(inttostr(v)); //23
end;

现在,已知v等于23,而且w和v之间有 v = (w and $f800) shr 11 的关系,
我怎么把w的$后面两个字'B9'求出来?
十分感谢大家指点.
 
我改过了 你重新看一下。
 
谢谢Miros
请您百忙帮我看看上面重新整理的问题,我想这样才能表达出我要请教的问题了.谢谢!
 
你这问题问得不对啊
w := $B921;
v := (w and $f800) shr 11;
Memo1.Lines.Add(inttostr(v)); //23
//w = 1011 1001 0010 0001
//$f800 = 1111 1000 0000 0000
//a shr 11 = 23 则 a >= $B800 ( 1011 1000 0000 0000 )
//则 w and $f800 >= B800
//由 w and 1111100000000000b >= 1011100000000000
//得 w >= 1011100000000000 (0xb800)
你要说固定的数如$B921是无法从23中反求的,因为过程中进行的and shr 等操作已经
将位丢失了。所以无法返回原来的$B921这个值。就是只可以反算出$B921所在的对于以
上过程满足的集合,而无法求出w原来的值$B921

如果你只是想反算回时间的TimeWord 按前面我说的就可以了。
 
谢谢Miros,我有点明白了,还可以请教吗?
这样$F800 $07E0 $001F我还是有点不明白它们是怎么来的
(Hours shl 11)的还原是(TimeWord and $F800) shr 11;
那么有什么公式 11对应$F800
$07E0对应 5
$001F对应1
谢谢
 
w := $B921; //二进制:w = 1011 1001 0010 0001
v := (w and $f800) shr 11; //二进制:$f800 = [red]1111 1[/red]000 0000 0000
//(w and $f800) = [red]1011 1[/red]000 0000 0000
//即与[red]1111 1[/red]000 0000 0000中1对应的位保留,与0对应的为清零
// shr 11: 右移11位:[red]1011 1[/red](十进制23)
实际上原代码中 and $f800 是多余的:
w := $B921;
v := w shr 11;
Memo1.Lines.Add(inttostr(v)); //23,结果还是23,你知道为什么吗?
认真看看下面就知道了:
1011 1000 0000 0000:
1011 1000 0000 000 // w shr 1
1011 1000 0000 00 // w shr 2
1011 1000 0000 0 // w shr 3
1011 1000 0000 // w shr 4
1011 1000 000 // w shr 5
1011 1000 00 // w shr 6
1011 1000 0 // w shr 7
1011 1000 // w shr 8
1011 100 // w shr 9
1011 10 // w shr 10
1011 1 // w shr 11 (10111:10进制的 23)
1011 1001 0010 0001:
1011 1001 0010 000 // w shr 1
1011 1001 0010 00 // w shr 2
1011 1001 0010 0 // w shr 3
1011 1001 0010 // w shr 4
1011 1001 001 // w shr 5
1011 1001 00 // w shr 6
1011 1001 0 // w shr 7
1011 1001 // w shr 8
1011 100 // w shr 9
1011 10 // w shr 10
1011 1 // w shr 11 (10111:10进制的 23)
 
补充一下:你的要求是做不到的。
举一个通俗的例子,有一个日期:2007-8-19,通过换算,可以求出年份 2007,可是你想通过 2007 反求出 2007-8-19 是不可能的。
 
来迟了,同意以上观点。
 
太谢谢了!分数少,不好意思.
 

Similar threads

I
回复
0
查看
776
import
I
I
回复
0
查看
563
import
I
I
回复
0
查看
854
import
I
后退
顶部