移位操作

本文深入探讨了位操作的基本函数,如获取和设置特定位置的位状态,以及处理8、16、24位数值的方法。通过具体示例,如从字节中提取和组合高位与低位,展示了位操作在权限设置和串口配置等场景的应用。

在权限设置或者串口设置等方面个人觉得很有用

 

 //获取每一位的状态  返回值 状态 0,1
  function GetBitSate(dw1:DWORD; Pos:Byte):Byte;
  //设置每一位的状态  返回值 设置后的数据
  function SetBitSate(dw1:DWORD; Pos:Byte; Sate: Byte): DWORD;
  //获取最后8,16,24位的值   返回值 8位的数值
  function GetValue(dw1:DWORD; Pos:Byte):Integer;
  //设置最后8位的值         返回值 设置后8位的数值
  function SetValue(dw1:DWORD; Pos:Byte; nValue:Integer):DWORD;

//从第0位开始   31,30,29..0;
function GetBitSate(dw1:DWORD; Pos:Byte):Byte;
begin
  Result:=((dw1 and (1 shl Pos))shr Pos);
end;

function SetBitSate(dw1:DWORD; Pos:Byte; Sate: Byte): DWORD;
var
  dw2: DWORD;
begin
  dw2 := dw1;
  Result := dw2;
  if GetBitSate(dw1,Pos) = Sate then Exit;
  case Sate of
    0: Result := dw2 and (not (1 shl Pos));
    1: Result := dw2 or (1 shl Pos);
  end;
end;

function GetValue(dw1:DWORD; Pos:Byte):Integer;
begin
  //取数的8位,16位,24位的值
  Result := 0;
  if not pos in[8,16,24] then Exit;
  case Pos of
    8: Result:= dw1 and $FF;
    16: Result:= dw1 and $FFFF;
    24: Result:= dw1 and $FFFFFF;
  end;
end;



function SetValue(dw1:DWORD; Pos:Byte; nValue:Integer):DWORD;
begin
  Result := 0;
  if not pos in[8,16,24] then Exit;
  case Pos of
    8: Result:= dw1 and (not $FF) or nValue;
    16: Result:= dw1 and (not $FFFF) or nValue;
    24: Result:= dw1 and (not $FFFFFF) or nValue;
  end;
end;


procedure TForm1.btn1Click(Sender: TObject);
var
  a, b: Byte;
  b1, b2: Byte;
begin
  //取一个字节中的前4位:v := v and $0F; //低4位
  //取一个字节中的后4位:v := v shr $04; //高4位
  a := 245;
  b1 := a and $0F;

 // 1111 0101
 // 0000 1111
  b2 := a shr $04;
  ShowMessage(IntToStr(b1));
  ShowMessage(IntToStr(b2));

  //将2个byte高低位合并
  b := (b1 and $0F) or (b2 shl $04);
  ShowMessage(IntToStr(b));
end;

 

转载于:https://www.cnblogs.com/doorsky/archive/2010/02/02/1662156.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值