蚯蚓兄请进,有几个问题请教!(50分)

  • 主题发起人 主题发起人 occult
  • 开始时间 开始时间
O

occult

Unregistered / Unconfirmed
GUEST, unregistred user!
看到蚯蚓兄关于一个二进制数位运算的问题,有几处不明,想请指点:
>>3.分别取a与b低位合并成c c:= 01010111;
>>>>>> C:=(A Shl 4) or (B and $0F);
请问1: 取一个整数的低位用 C:=B and $0F,那么取一个整数的高位该如何写
呢?显然 C:= (A shl 4) and 1是不行的.

请问2:

>>>>>定义函数SetBit,给Value的第Bit位置位
>>>>>procedure SetBit(var Value:Byte;Bit:Byte);
>>>>>begin
>>>>> Value:=Value or (1 Shl Bit);
>>>>>end;

我对这个过程有质疑,觉的不如改成为如下二个过程,一个用设置位为1,
一个用来设置位为0
function SetBitOn(Value:integer;Bit:Byte):integer;
begin
REsult:= Value or ( 1 Shl Bit );
end;

function SetBitOFF(Value:integer;Bit:Byte):integer;
begin
Result: Value and not ( 1 Shl Bit );
end;


请问3: 为什么不用VCL中的TBits类呢?
 
1. 取高位 C:=(A shr 4) shl 4;

2. 该函数没有问题
 
3、当然也可以用TBits类,一题多解。我初中的几何老师经常一道题给出20多种解法
hubdog妩媚的盈盈轻笑,结果噼哩啪啦从天下掉下一串乌鸦
 
首先澄清一点,以下运算变量都是Byte,
其他类型的整数与此类似,自己去数一下位数吧

1、取高位的问题
C:=A shr 4
右移4位就可以了,
然后你怎么处理这个结果就是使用上的问题了

2、为什么不写两个过程
(1)当时那个问题只涉及到某位置1,似乎不需要置0
(2)忙,懒~~

3、为什么不用VCL中的TBits类
(1)当时那个问题是直接处理Byte,用位运算更方便
(2)速度快
(3)没想起来~~

当然具体的问题要具体对待,
如果你在处理问题时适合用TBits,那就用吧

另外你那两个过程可以合并:
function SetBit(Value:integer;Bit:Byte;<font color=red>On:Boolean</font>):integer;
var
Mask:Integer;
begin
Mask:=1 shl Bit;
if On then
Result:= Value or Mask
else
Result:= Value and (not Mask);
end;

平时吹毛吹得太多了,
恶习难改,别生气~~
 
多人接受答案了。
 
后退
顶部