Qokelate 发表于 2012-7-9 14:53:37

已解决 如何取得某数字的二进制最高位是第几位?

本帖最后由 Qokelate 于 2012-7-30 00:12 编辑

例如 :

10进制   二进制   最高位   (从右往左数,最左边的1是第几位)
1         0001    1
2         0010    2
3         0011    2
4         0100    3

怎样取出得到某数字的最高位是第几位?

298311657 发表于 2012-7-9 15:34:02

随手写了一段代码,没有严格测试,不知道是否有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

lchl0588 发表于 2012-7-9 16:47:27

回复 1# Qokelate
不知道二进制里面是不是由0,1组合,如果是,以下代码成立:$1="0001"
MsgBox(0,0,StringLen(StringTrimLeft($1,StringInStr($1,"1")-1)))

ooxxgod 发表于 2012-7-9 16:54:53

一起研究下{:face (382):}

502762378 发表于 2012-7-9 17:21:00

回复 3# lchl0588


    无耻一下$1="1001"
MsgBox(0,0,StringLen($1)-StringInStr($1,"1")+1)

afan 发表于 2012-7-9 17:22:50

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:50:37

本帖最后由 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))

3mile 发表于 2012-7-9 19:06:56

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

Qokelate 发表于 2012-7-9 19:19:04

回复 8# 3mile

再请教个问题,如果数字是负数,因为负数的第一位总是1,怎样把其第一位过滤掉再取其高位?

netegg 发表于 2012-7-10 10:31:29

回复 9# Qokelate

先判断正负然后再处理

Qokelate 发表于 2012-7-10 12:32:21

回复 10# netegg


    这个我知道,但怎样过滤掉负数第一位的1?

netegg 发表于 2012-7-10 13:27:40

回复 11# Qokelate
论坛里有过一个帖子好像说过二进制的负数,找找看,那个数比较怪,应该可以分的出来

Qokelate 发表于 2012-7-10 14:52:14

回复 12# netegg


    还是没头绪~~~

pusofalse 发表于 2012-7-10 16:59:25


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:51:21

本帖最后由 Qokelate 于 2012-7-10 17:53 编辑

回复 14# pusofalse


    3 的二进制是0000 0011最高位应该是2啊为什么返回的是1?
-90的二进制是 1010 0110 最高位是6怎样得到这个最高位?(如果数字是负数,则把其第一位过滤掉再取其高位因为负数的第一位总是1)
页: [1]
查看完整版本: 已解决 如何取得某数字的二进制最高位是第几位?