怎样实现二进制数据的按位与操作?(50分)

  • 主题发起人 主题发起人 dafuwengqing
  • 开始时间 开始时间
D

dafuwengqing

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现如下效果:
有一个字符串为“000000”
满足条件1则第1位置为1
满足条件2则第2位置为1
满足条件3则第3位置为1
满足条件4则第4位置为1
满足条件5则第5位置为1
满足条件6则第6位置为1
代码如下:
但是编辑通不过?
myCellPro.Border:='000000';
myborder:=StrToBool(myCellPro.Border);
if myCellRange.TableBorder.IsLeftLineValid then
myborder and StrToBool('100000');//结果为第1位为1
if myCellRange.TableBorder.IsRightLineValid then
myborder and StrToBool('010000');//结果为第2位为1
if myCellRange.TableBorder.IsTopLineValid then
myborder and StrToBool('001000');//结果为第3位为1
if myCellRange.TableBorder.IsBottomLineValid then
myborder and StrToBool('000100');//结果为第4位为1
if myCellRange.TableBorder.IsHorizontalLineValid then
myborder and StrToBool('000010');//结果为第5位为1
if myCellRange.TableBorder.IsVerticalLineValid then
myborder and StrToBool('000001');//结果为第6位为1
myCellPro.Border:=BoolToStr(myborder);//用(111111)表示
 
可以做掩码
比如
条件1就是$01
条件2就是$02
比较的时候就用
int a=StrToInt('000000');
if a and $01<>0 then
条件1成立
else if a and $02><>0 then
条件2成立
 
根据您的题意应该用左移(shl)的办法,比如基数为1,满足条件1则左移一位,满足条件2则左移二位……类推。如果结果必须为串则只要将数作一次转换。
 
if myCellRange.TableBorder.IsLeftLineValid then
myborder:='1'//00000');//结果为第1位为1
else myborder:='0';
if myCellRange.TableBorder.IsRightLineValid then
myborder :=myborder + '1'//);//结果为第2位为1
else
else myborder:=myborder+'0';
if myCellRange.TableBorder.IsTopLineValid then
myborder :=myborder + '1'//);//结果为第3位为1
else
else myborder:=myborder+'0';
if myCellRange.TableBorder.IsBottomLineValid then
myborder :=myborder + '1'//);//结果为第4位为1
else
else myborder:=myborder+'0';
if myCellRange.TableBorder.IsHorizontalLineValid then
myborder :=myborder + '1'//);//结果为第5位为1
else
else myborder:=myborder+'0';
if myCellRange.TableBorder.IsVerticalLineValid then
myborder :=myborder + '1'//);//结果为第6位为1
else
else myborder:=myborder+'0';
myCellPro.Border:=myborder;//用(111111)表示

按照你的想法简单修改了一下,应该可以实现。我使用了笨办法。
 
不一定要这样做。可以用一个整型的数表示
满足条件1则 1
满足条件2则 2
满足条件3则 4
满足条件4则 8
满足条件5则 16
满足条件6则 32

myCellPro.Border:='000000';
myborder:=0;
if myCellRange.TableBorder.IsLeftLineValid then
myborder := myborder + 1
if myCellRange.TableBorder.IsRightLineValid then
myborder := myborder + 2
if myCellRange.TableBorder.IsTopLineValid then
myborder := myborder + 4
if myCellRange.TableBorder.IsBottomLineValid then
myborder := myborder + 8
if myCellRange.TableBorder.IsHorizontalLineValid then
myborder := myborder + 16
if myCellRange.TableBorder.IsVerticalLineValid then
myborder := myborder + 32
再用一个函数将 myborder转成 二进制
myCellPro.Border:=.. ;//用(111111)表示
 
function IntToBCD(n:Integer;BCDLen:Integer):String
//bcdlen代表代表转换后二进制的位数.
begin
Result:='';
while n<>0 do
begin
Result:=Char(Byte('0')+(n and 1))+Result;
n:=n shr 1;
end;
while Length(Result)<BCDLen do
Result:='0'+Result;
if Length(Result)>BCDLen then
Result:=Copy(Result,Length(Result)-BCDLen+1,BCDLen);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Str:String;
myborder:Integer;
begin
myborder:=0
//初始化
if 1=1 then
myborder:=myborder or $20;//结果为第1位为1
if 2=2 then
myborder:=myborder or $10;//结果为第2位为1
if 3=3 then
myborder:=myborder or $08;//结果为第3位为1
if 4=4 then
myborder:=myborder or $04;//结果为第4位为1
if 5=5 then
myborder:=myborder or $02;//结果为第5位为1
if 6=6 then
myborder:=myborder or $01;//结果为第6位为1
Str:=IntToBCD(myborder,6)
//用IntToBCD转回为二进制
//Caption:=Str;
end;
 
不用这么麻烦吧,如果用二进制还这么麻烦真不如用数字来表示了
用newsmile所说的比较有道理
Flag:=0;//标志位
j:=1;//临时数
for i:=1 to 6 do
begin
if 满足第i个条件 then
Flag:=Flag or j
//加入标志
j:=j shl 1
//标志左移
end;
当然,我的第一位在右边,你的第一位在左边,我想我的方法方便些
 
后退
顶部