找回密码
 加入
搜索
查看: 5970|回复: 14

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

 火.. [复制链接]
发表于 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

怎样取出得到某数字的最高位是第几位?
发表于 2012-7-9 15:34:02 | 显示全部楼层
随手写了一段代码,没有严格测试,不知道是否有bug
MsgBox(0,DECtoBIN(5),DECtoBIN(5,True))
Func DECtoBIN($iDEC, $HighWord = False)
        Local $n=0, $i, $iBin, $aBin[1]
        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金钱 +10 收起 理由
Qokelate + 10 辛苦了

查看全部评分

发表于 2012-7-9 16:47:27 | 显示全部楼层
回复 1# Qokelate
不知道二进制里面是不是由0,1  组合,如果是,以下代码成立:
$1="0001"
MsgBox(0,0,StringLen(StringTrimLeft($1,StringInStr($1,"1")-1)))

评分

参与人数 1金钱 +40 收起 理由
502762378 + 40

查看全部评分

发表于 2012-7-9 16:54:53 | 显示全部楼层
一起研究下
发表于 2012-7-9 17:21:00 | 显示全部楼层
回复 3# lchl0588


    无耻一下
$1="1001"
MsgBox(0,0,StringLen($1)-StringInStr($1,"1")+1)
发表于 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

评分

参与人数 1金钱 +10 收起 理由
Qokelate + 10 谢谢帮忙

查看全部评分

 楼主| 发表于 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))
发表于 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

评分

参与人数 1金钱 +10 收起 理由
Qokelate + 10 很棒的见解

查看全部评分

 楼主| 发表于 2012-7-9 19:19:04 | 显示全部楼层
回复 8# 3mile

再请教个问题,如果数字是负数,因为负数的第一位总是1,怎样把其第一位过滤掉再取其高位?
发表于 2012-7-10 10:31:29 | 显示全部楼层
回复 9# Qokelate

先判断正负然后再处理
 楼主| 发表于 2012-7-10 12:32:21 | 显示全部楼层
回复 10# netegg


    这个我知道,但怎样过滤掉负数第一位的1?
发表于 2012-7-10 13:27:40 | 显示全部楼层
回复 11# Qokelate
论坛里有过一个帖子好像说过二进制的负数,找找看,那个数比较怪,应该可以分的出来
 楼主| 发表于 2012-7-10 14:52:14 | 显示全部楼层
回复 12# netegg


    还是没头绪~~~
发表于 2012-7-10 16:59:25 | 显示全部楼层

Func _BitTest($iValue)
        Local Static $aIndex[32] = [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))

评分

参与人数 1金钱 +16 贡献 +2 收起 理由
user3000 + 16 + 2 HOHO~! P 大现身矣.

查看全部评分

 楼主| 发表于 2012-7-10 17:51:21 | 显示全部楼层
本帖最后由 Qokelate 于 2012-7-10 17:53 编辑

回复 14# pusofalse


    3 的二进制是  0000 0011  最高位应该是2啊  为什么返回的是1?
  -90的二进制是 1010 0110 最高位是6  怎样得到这个最高位?  (如果数字是负数,则把其第一位过滤掉再取其高位  因为负数的第一位总是1)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-6-2 09:49 , Processed in 0.105125 second(s), 31 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表