一个极其简单的问题,寻求最简单的方法 我想检查一个十进制整数作为二进制时第n位是否为1,如何用最简单的方法实现,请指点! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 function CheckBin(Value, n: Integer): Boolean;begin Result := (Value and (1 shl n)) <> 0; // n = 0,1....end; upfunction CheckBin(Value, n: Integer): Boolean;begin Result := (Value and (1 shl n))end; function CheckBin(Value, n: Integer): Boolean;begin Result:=Boolean((Value shr n) and 1);end;一样吗?不一样,这样可以少执行一条指令 楼上的编译结果是mov ecx,edxmov edx,$00000001shl edx,cland eax,edx我下面代码的编译结果是mov ecx,edxshr eax,cland eax,$01少执行了一次mov数据传送指令 一楼的编译结果需要五条指令编译后虽然省了AND指令,但多用了条TEST指令,执行时钟周期为2,比上面的AND要多再加上一条SETNZ al设定返回值,执行效率比较"低"啊当然一般开发不用考虑这些,以上就当玩笑,呵呵 大家有没有注意当Value为负数时,上面的程序能不能得到正确的结果? 就事论事说:从效率上看,Result:=Boolean((Value shr n) and 1);确实是最高的,但可读性不如 Result := (Value and (1 shl n)) <> 0;至于Result := (Value and (1 shl n));则编译不能通过。 楼上没完全理解我要说明的关键在于到底是对Value还是对1进行移位操作的问题二楼的错误,放到其它非强类型语言中就没问题了,如C至于可读性问题?反正写起来都很简单,无所谓啦 楼上的,我不是评论谁好谁不好,而确实是就事论事说,其实,我喜欢你的代码,我的代码也可改为Result := Boolean((Value and (1 shl n)))只是隐晦了点,特别是对初学者,至于我楼下的可能用C习惯了,没注意Pascal的强类型性 呵呵,我不是说你说的不对,只是说明一下我所说的关键在于什么,Value的值已经在寄存器中,对它进行移位可直接进行,对1进行移位还需要执行一次数据移动指令!一般人写程序根本不用考虑这些,快那么几个时钟周期没有很大的意义 如何用内存表处理blob字段 设置为rowselect,但是有一列除外! Delphi高手过来看看 请问动态创建ado组件问题? 为什么扣我专家分?请斑竹回答! 为一个简单问题郁闷ing.... 为什么我动态更新TClientDataSet的CommandText老是出错 如何把图片文件存贮到sqlserver数据库? 谁能告诉一下dephi7.0的序列号。 求助Delphi登陆窗口中,用combobox显示数据库中的用户名 简单问题,拿分容易阿!~(2) 谁有精典控件网址呢?
begin
Result := (Value and (1 shl n)) <> 0; // n = 0,1....
end;
begin
Result := (Value and (1 shl n))
end;
begin
Result:=Boolean((Value shr n) and 1);
end;一样吗?不一样,这样可以少执行一条指令
mov edx,$00000001
shl edx,cl
and eax,edx我下面代码的编译结果是
mov ecx,edx
shr eax,cl
and eax,$01少执行了一次mov数据传送指令