我想检查一个十进制整数作为二进制时第n位是否为1,如何用最简单的方法实现,请指点!

解决方案 »

  1.   

    function CheckBin(Value, n: Integer): Boolean;
    begin
      Result := (Value and (1 shl n)) <> 0;  // n = 0,1....
    end;
      

  2.   

    upfunction CheckBin(Value, n: Integer): Boolean;
    begin
      Result := (Value and (1 shl n))
    end;
      

  3.   

    function CheckBin(Value, n: Integer): Boolean;
    begin
      Result:=Boolean((Value shr n) and 1);
    end;一样吗?不一样,这样可以少执行一条指令
      

  4.   

    楼上的编译结果是mov ecx,edx
    mov edx,$00000001
    shl edx,cl
    and eax,edx我下面代码的编译结果是
    mov ecx,edx
    shr eax,cl
    and eax,$01少执行了一次mov数据传送指令
      

  5.   

    一楼的编译结果需要五条指令编译后虽然省了AND指令,但多用了条TEST指令,执行时钟周期为2,比上面的AND要多再加上一条SETNZ al设定返回值,执行效率比较"低"啊当然一般开发不用考虑这些,以上就当玩笑,呵呵
      

  6.   

    大家有没有注意当Value为负数时,上面的程序能不能得到正确的结果?
      

  7.   

    就事论事说:从效率上看,Result:=Boolean((Value shr n) and 1);确实是最高的,但可读性不如 Result := (Value and (1 shl n)) <> 0;至于Result := (Value and (1 shl n));则编译不能通过。
      

  8.   

    楼上没完全理解我要说明的关键在于到底是对Value还是对1进行移位操作的问题二楼的错误,放到其它非强类型语言中就没问题了,如C至于可读性问题?反正写起来都很简单,无所谓啦
      

  9.   

    楼上的,我不是评论谁好谁不好,而确实是就事论事说,其实,我喜欢你的代码,我的代码也可改为Result := Boolean((Value and (1 shl n)))只是隐晦了点,特别是对初学者,至于我楼下的可能用C习惯了,没注意Pascal的强类型性
      

  10.   

    呵呵,我不是说你说的不对,只是说明一下我所说的关键在于什么,Value的值已经在寄存器中,对它进行移位可直接进行,对1进行移位还需要执行一次数据移动指令!一般人写程序根本不用考虑这些,快那么几个时钟周期没有很大的意义