求几个 shl shr and  位移操作的列子 
最迷糊的就是 and 
希望能高手们解释详细点
谢谢

解决方案 »

  1.   

    20 and 23 =20
    20的二进制为10100
    11           10111  
    1 and 0=0 0 and 0=0 1 and 1=120 shr  1=10 (1010)
    20 shl  1=40  (101000)      
      

  2.   

    var
      nTmp : Integer;
      nTest: Integer;
    begin
        // 右移位操作示意:
      nTmp:= $00FF0000;
      ShowMessage(IntToStr(BYTE(nTmp shr 16)));  //向右移动16位,也就是2个字节,  00 FF 00 00,那么结果就是$FF  // 左移位操作示意:
      nTmp:= $FF;
      ShowMessage(IntToStr(BYTE(nTmp shl 16)));  // 向左移动16位置,也就是2个字节,00 FF 00 00,就是$00FF0000  // AND 运算示意:
      nTmp := $00123456;
      nTest:= $FFFF0000;
      ShowMessage(IntToStr(nTest and nTmp));     // 结果$00120000
      // 计算过程如下:      
      // nTest: $FF FF 00 00
      // nTmp : $00 12 34 56
      // ----------------------
      // 结果  : $00 12 00 00
      
      // OR 运算示意:  
      nTmp := $00123456;
      nTest:= $FFFF0000;
      ShowMessage(IntToStr(nTest OR nTmp));     // 结果$FFFF3456  // 计算过程
      // nTest: $FF FF 00 00
      // nTmp : $00 12 34 56
      // ----------------------
      // 结果  : $FF FF 34 56
    end;
      

  3.   

    老大
    再请教下
    $00FF0000;

    $FF0000;
    有什么区别?
      

  4.   

    应该是好看点吧
    希望能解释下
    原理
    and 的原理是不是这样
    比如
    Integer1:=$FFFF0000; 
    Integer2:=$0000FFFF; 
    得到的是0;
    是不是 两个操作数的拿个位是一样的 返回值的那个位就是 那个位的值 否则 返回0
    就像这样
    for i:=0 to 10 do
     if String1[i]=String2[i] then 
        String3[i]:=String1[i] else String3[i]:=0;
      

  5.   

    楼主的方法是对的
    1 and 1=1
    1 and 0=0
    0 and 1=0
    而多位的and操作则是逐位比较
    shl 左移N位 也就是二进制的后面添加N个0,等于乘以2^n
    shr 右移N位 也就是二进制的去掉后面N位,等于除以2^n(整除)
    当然 shl 用的时候要注意溢出问题
    比如byte类型的,有8位,200=11001000
    shl 1后 变成10010000=144 前面那位就被忽略掉了