已解决 如何取得某数字的二进制最高位是第几位?
本帖最后由 Qokelate 于 2012-7-30 00:12 编辑例如 :
10进制 二进制 最高位 (从右往左数,最左边的1是第几位)
1 0001 1
2 0010 2
3 0011 2
4 0100 3
怎样取出得到某数字的最高位是第几位? 随手写了一段代码,没有严格测试,不知道是否有bugMsgBox(0,DECtoBIN(5),DECtoBIN(5,True))
Func DECtoBIN($iDEC, $HighWord = False)
Local $n=0, $i, $iBin, $aBin
Do
$n+=1
ReDim $aBin[$n]
$aBin[$n-1] = Mod($iDEC,2)
$iDEC=Int($iDEC/2)
Until $iDEC<1
If $HighWord Then
For $i = UBound($aBin)-1 To 0 Step -1
If $aBin[$i] = 1 Then Return $i+1
Next
Else
For $i = UBound($aBin)-1 To 0 Step -1
$iBin&=$aBin[$i]
Next
Return $iBin
EndIf
EndFunc 回复 1# Qokelate
不知道二进制里面是不是由0,1组合,如果是,以下代码成立:$1="0001"
MsgBox(0,0,StringLen(StringTrimLeft($1,StringInStr($1,"1")-1))) 一起研究下{:face (382):} 回复 3# lchl0588
无耻一下$1="1001"
MsgBox(0,0,StringLen($1)-StringInStr($1,"1")+1) Local $n = 4
MsgBox(0, _D2B($n), @extended)
Func _D2B($n)
Local $sRn, $iL = 0
While $n
$sRn = StringMid('01', Mod($n, 2) + 1, 1) & $sRn
$n = Int($n / 2)
$iL += 1
WEnd
Return SetExtended($iL, $sRn)
EndFunc ;==>_D2B 本帖最后由 Qokelate 于 2012-7-9 18:54 编辑
学习了各位的思路自己尝试写个,不知有没Bug,谢谢大家帮助Func BinaryHB($iNumber)
If $iNumber < 1 Then Return 0
Local $iB = 0
While 1
If 2 ^ $iB > $iNumber Then ExitLoop
$iB += 1
WEnd
Return $iB
EndFunc ;==>BinaryHB
MsgBox(0, 0, BinaryHB(257))
MsgBox(0, 0, BinaryHB(256))
MsgBox(0, 0, BinaryHB(255)) Local $N = 561
MsgBox(0, $N, High_Bit($N))
Func High_Bit($N)
Local $c = 0
While $N
$N = BitShift($N, 1)
$c += 1
WEnd
Return $c
EndFunc ;==>High_Bit
回复 8# 3mile
再请教个问题,如果数字是负数,因为负数的第一位总是1,怎样把其第一位过滤掉再取其高位? 回复 9# Qokelate
先判断正负然后再处理 回复 10# netegg
这个我知道,但怎样过滤掉负数第一位的1? 回复 11# Qokelate
论坛里有过一个帖子好像说过二进制的负数,找找看,那个数比较怪,应该可以分的出来 回复 12# netegg
还是没头绪~~~
Func _BitTest($iValue)
Local Static $aIndex = [0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 31, 27, 13, 23, 21,
19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9]
Local $iIndex = BitAND(BitShift(BitAND($iValue, -$iValue) * 0x77CB531, 27), 31)
Return $aIndex[$iIndex] + 1
EndFunc ;==>_BitTest
MsgBox(0, "", _BitTest(3)) 本帖最后由 Qokelate 于 2012-7-10 17:53 编辑
回复 14# pusofalse
3 的二进制是0000 0011最高位应该是2啊为什么返回的是1?
-90的二进制是 1010 0110 最高位是6怎样得到这个最高位?(如果数字是负数,则把其第一位过滤掉再取其高位因为负数的第一位总是1)
页:
[1]