function SetCharBit(Ch: Char; Pos, Bit: Integer): Char;
var
  MyByte, Byte2: Byte;
  MyCh: char;
begin
  if Bit = 1 then
  begin
    Move(Ch, Byte2, 1); //将Ch的前1个字节传给Byte2
    MyByte := Round(Power(2, Pos));//2的Pos次方四舍五入
    Byte2 := Byte2 or MyByte;
    Move(Byte2, MyCh, 1);
  end
  else if Bit = 0 then
  begin
    Mybyte := $FF - Round(Power(2, Pos));
    Move(Ch, Byte2, 1);
    Byte2 := Byte2 and MyByte;
    Move(Byte2, MyCh, 1);
  end;
  Result := MyCh;
end;
请逐句解释一下,谢谢

解决方案 »

  1.   


    function SetCharBit(Ch: Char; Pos, Bit: Integer): Char;
    var
      MyByte, Byte2: Byte;
      MyCh: char;
    begin
      if Bit = 1 then
      begin
        Move(Ch, Byte2, 1); //将Ch的前1个字节传给Byte2
        MyByte := Round(Power(2, Pos));//2的Pos次方四舍五入
        Byte2 := Byte2 or MyByte;//Byte2与MyByte进行or的位运算,然后传给Byte2
        Move(Byte2, MyCh, 1);//将Byte2的前1个字节传给MyCh
      end
      else if Bit = 0 then
      begin
        Mybyte := $FF - Round(Power(2, Pos));//$FF减去2的Pos次方传给Mybyte
        Move(Ch, Byte2, 1);//将Ch的前1个字节传给Byte2
        Byte2 := Byte2 and MyByte;//Byte2与MyByte进行and的位运算,然后传给Byte2
        Move(Byte2, MyCh, 1);//将Byte2的前1个字节传给MyCh
      end;
      Result := MyCh;//将MyCh作为结果返回
    end;
      

  2.   

    位运算:引自http://www.cnblogs.com/Equn93/archive/2011/11/30/2269590.html
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        Button5: TButton;
        Button6: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button5Click(Sender: TObject);
        procedure Button6Click(Sender: TObject);
      end;var
      Form1: TForm1;implementation{$R *.dfm}const
      w1: Word = 61680; {二进制表示: 11110000 11110000}
      w2: Word = 3855;  {二进制表示: 00001111 00001111}
    var
      w: Word;{not 运算, 只有一个运算数}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      w := not w1;  {not 就是按位(给二进制的每一位)取反}
      {11110000 11110000 取反后就是:}
      {00001111 00001111 }
      ShowMessage(IntToStr(w)); {3855}
    end;{and 运算, 需要两个运算数}
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      w := w1 and w2;  {and 就是把两个运算数按位对比, 同是1返回1, 反之返回0}
      {w1: 11110000 11110000 与}
      {w2: 00001111 00001111 每一位都不同, 所以返回:}
      {w : 00000000 00000000}
      ShowMessage(IntToStr(w)); {0}
    end;{or 运算, 需要两个运算数}
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      w := w1 or w2;  {and 就是把两个运算数按位对比, 只有其中一个是1就返回1; 都是0才返回0}
      {w1: 11110000 11110000 与}
      {w2: 00001111 00001111 or 后会返回:}
      {w : 11111111 11111111}
      ShowMessage(IntToStr(w)); {65535}
    end;{xor 运算, 需要两个运算数}
    procedure TForm1.Button4Click(Sender: TObject);
    begin
      w := w1 or w2;  {and 就是把两个运算数按位对比, 只有两个不一样才返回1; 一样(都是0或都是1)则返回0}
      {w1: 11110000 11110000 与}
      {w2: 00001111 00001111 xor 后会返回:}
      {w : 11111111 11111111}
      ShowMessage(IntToStr(w)); {65535; 两个例数不太好, 没给 xor 和 or 区别明显}
    end;{shr 运算, 只有一个运算数}
    procedure TForm1.Button5Click(Sender: TObject);
    begin
      w := w1 shr 1;  {shr 是按位右移, shr 1 是右移一位}
      {w1: 11110000 11110000 右移一位后是:}
      {w : *1111000 01111000 前面的*就是0了}
      ShowMessage(IntToStr(w)); {30840}  {同理, 可以移动几位, 譬如 3 位}
      w := w1 shr 3;
      ShowMessage(IntToStr(w)); {7710}  {w1 shr 3 相当与 w1 div 2的3次方}
      w := w1 div 8;
      ShowMessage(IntToStr(w)); {7710}
    end;{shl 运算, 只有一个运算数}
    procedure TForm1.Button6Click(Sender: TObject);
    var
      i: Integer;
    begin
      w := w1 shl 1;  {shr 是按位左移}
      {w1: 11110000 11110000 左移一位后是:}
      {w : 1110000 111100000 }
      ShowMessage(IntToStr(w)); {57824}  {左移 3 位}
      w := w1 shl 3;
      ShowMessage(IntToStr(w)); {34688}  {w1 shl 3 相当与 w1 * 2的3次方}
      w := w1 * 8;
      ShowMessage(IntToStr(w)); {34688}  {注意这里有个问题: w1*8 以后怎么小了呢?}
      {因为前面已经定义了 w 是 Word 类型的, 它的大小只有2个字节(二进制16位), 超出会忽略}  {如果换成32位(4字节)的 Integer 类型, 肯定就会有真实的结果:}  i := w1 shl 3;
      ShowMessage(IntToStr(i)); {493440}  i := w1 * 8;
      ShowMessage(IntToStr(i)); {493440}
    end;end.
      

  3.   


    function SetCharBit(Ch: Char; Pos, Bit: Integer): Char;
    当Bit=1时,返回Byte(Ch)+2的Pos次方对应的字符
    当Bit=0时,返回Byte(Ch)-2的Pos次方对应的字符
      

  4.   


    function SetCharBit(Ch: Char; Pos, Bit: Integer): Char;
    当Bit=1时,返回Byte(Ch)+2的Pos次方对应的字符
    当Bit=0时,返回Byte(Ch)-2的Pos次方对应的字符如果2的Pos次方这个换做移位的解释呢?
      

  5.   


    function SetCharBit(Ch: Char; Pos, Bit: Integer): Char;
    当Bit=1时,返回Byte(Ch)+2的Pos次方对应的字符
    当Bit=0时,返回Byte(Ch)-2的Pos次方对应的字符如果2的Pos次方这个换做移位的解释呢?可以
    当Bit=1时,返回Byte(Ch)+1向左移Pos位
    当Bit=0时,返回Byte(Ch)-1向右移Pos位
      

  6.   


    function SetCharBit(Ch: Char; Pos, Bit: Integer): Char;
    当Bit=1时,返回Byte(Ch)+2的Pos次方对应的字符
    当Bit=0时,返回Byte(Ch)-2的Pos次方对应的字符如果2的Pos次方这个换做移位的解释呢?可以
    当Bit=1时,返回Byte(Ch)+1向左移Pos位
    当Bit=0时,返回Byte(Ch)-1向右移Pos位Byte(Ch)+(1向左移Pos位)
    Byte(Ch)-(1向右移Pos位)
    对吗?
      

  7.   


    function SetCharBit(Ch: Char; Pos, Bit: Integer): Char;
    当Bit=1时,返回Byte(Ch)+2的Pos次方对应的字符
    当Bit=0时,返回Byte(Ch)-2的Pos次方对应的字符如果2的Pos次方这个换做移位的解释呢?可以
    当Bit=1时,返回Byte(Ch)+1向左移Pos位
    当Bit=0时,返回Byte(Ch)-1向右移Pos位Byte(Ch)+(1向左移Pos位)
    Byte(Ch)-(1向右移Pos位)
    对吗?是的