wzwgp 发表于 2007-1-25 12:42:42

C语言位运算

C语言没学好,位运算搞不明白,很是惭愧,有一问题请教兄弟们:

表达式中C1..C8是常数,s1..s8是变量(常数、变量类型是16进制数)

#define C1 0x897E8120
#define C2 0xE894C465
#define C3 0x5671B3A6
#define C4 0x65488944
#define C5 0x48492458
#define C6 0x50540150
#define C7 0x76DBFAAF
#define C8 0x12165400

((((s4^s7)&C3)^s7)^C4) ^ (((s2^s8)&C5)^s8)==C1;
(((s6^s1)&C6)^s6)^ (((s3^s5)&C7)^s5^C8)==C2;

列出满足条件的s1..s8

coolpeople 发表于 2007-1-25 22:05:03

第八章位运算没学。。。有空学完帮你。。:$

coolpeople 发表于 2007-1-26 14:44:14

今天看了下书。。。把C1...C8的16进制数换成2进制。。。&就是逐比特相与。。。同是1相与为1。。有0相与为0。。
^为异或运算。。。
好像还有逻辑与。。或。。和异或之间的公式。。忘了:$

黑夜彩虹 发表于 2007-1-26 17:05:26

我朋友说这样,兄弟试试~~

procedure TForm1.Button1Click(Sender: TObject);
const
c1 = $2927907884;
c2 = $1347682640;
c3 = $3902063717;
var
s1,s6, X, Y: LongWord;
Cnt: Integer;
begin
//ShowMessage(IntToStr(High(LongWord)));
X := High(LongWord) div 2;
Cnt := 0;
Y := 0;
for s1 := 0 to X do
begin
    for s6 := X downto 0 do
    begin
      if ((((s1 xor s6) and c2) xor s1)=c1) and
         ((((s6 xor s1) and c2) xor s6)=c3) then
      begin
      Memo1.Lines.Add(inttostr(s1)+'-'+inttostr(s6));
      Inc(Cnt);
      end;
    end;
    Inc(Y);
    Caption := IntToStr(Y * 100 div X) + '%';
    Application.ProcessMessages;
end;
ShowMessage(IntToStr(Cnt));
end;

angelwings 发表于 2007-1-26 20:25:55

今天晚上翻翻书,明天告诉你!!

wzwgp 发表于 2007-1-29 12:40:54

原帖由 黑夜彩虹 于 2007-1-26 17:05 发表
procedure TForm1.Button1Click(Sender: TObject);
const
c1 = $2927907884;
c2 = $1347682640;
c3 = $3902063717;
var
s1,s6, X, Y: LongWord;
Cnt: Integer;
begin
//ShowMessage(IntToStr( ...

没通过
页: [1]
查看完整版本: C语言位运算