如何判断某一个二进制数哪一位为1?(100分)

  • 主题发起人 主题发起人 georgechen
  • 开始时间 开始时间
G

georgechen

Unregistered / Unconfirmed
GUEST, unregistred user!
通过硬件提供的函数可以得到端口的输出数值。需要判断某一个二进制为是否为1,然后作出响应。

我知道用位数作与运算即可得到。请问在Delphi中怎么实现?
 
function GetBits(abyte: byte
aind: integer);
begin
GetBits := 1 shl aind abyte;
end;
 

function GetBit(b: byte
n: byte): boolean;
begin
Result := ((b shr n) and 1) = 1;
end;

 
if $80 and x = $80 then
$80 = 1000 0000
$40 = 0100 0000
$20 ,$10 , $08 ..........
 
C代码:(x>>n)&1
 
如果你想把它转换成字符串,然后再比较也可以,不过麻烦一些。
 
一样可以用按位与(and)、异或(xor)等!
 
你可以用shl或shr对你所要判断的数进行左移或右移,然后和1作与判断哪一位是1,如:
function GetBits(ANum:integer;AOffset:byte):bool;
var
Value:integer;
begin
Value:=(ANum shr AOffset) and 1;
if Bool(Value) then
result:=true
else
result:=false

end;
你可以将它放入一个循环,从而得到每一位的状态。
 
只要用0001,0010,0100 等与原数OR就可以了
function(n:shortint,yournumber:integer):boolean;
//n表示第几位,从左到右
begin
if ((1 shl n) or yournumber)=0 then
result:=false
else result:=true


end;
 
通常,用 Flags and Mask = Mask 来判断,例如:
//Flag是一个16位整数,现在要判断最高位是否为1,则Mask为$8000
if Flags and $8000 <> 0 then
...

另外,我介绍一种本人常采用的集合判断法(推荐):
var
Flags:set of [0..15];
begin
Word(Flags):=??
//GetFlag
//要判断第 n (n=0..15)位是否为1:
if n in Flags then
...
end;
使用集合,你需要理解的是:集合中的每一个元素占据一个二进制位。
采用这种方法,你可以让程序更具可读性,如你可以根据Flag各位的含义对每一个位进行
命名,以后你就不必关心哪个标志是在那一位了——用名字判断即可。如:
type
TFlagNames=(Name0,Name1,Name2,...,SomeFlag,...,UnUsedBit,...Name15)
//NameX随意命名
var
Flags:set of [TFlagNames];
begin
Word(Flags):=??
//GetFlag
if SomeFlag in Flags then
...
end;

如果你不是直接判断某一位是否被置位,而是要判断哪一位或哪几位被置位,那你得用循环:
var
Flag:TFlagNames;
begin
...
for Flag:=Name0 to Name15 do
if Flag in Flags then
DoSomeThing;
...
end;
 
有多种方法

x and (1 shl n) > 0
(x shr n) and 1 > 0
odd(x shr n)
(x shr n) shl 7 = $80 //假设是1Byte
...
 
多人接受答案了。
 
后退
顶部