找回密码
 加入
搜索
查看: 11365|回复: 28

[效率算法] 10道位运算题目。

 火... [复制链接]
发表于 2010-9-25 23:38:46 | 显示全部楼层 |阅读模式
本帖最后由 pusofalse 于 2010-9-25 23:58 编辑

旨在学习位运算,解题时禁止使用各种判断、循环语句,和+ - * / ^、> < >=  <=运算符和比较符,并且只能调用以下这些函数:

1、BitAnd
2、BitOR
3、BitXOR
4、BitNot
5、BitShift
6、BitRotate
7、Random(用于测试随机数据)
8、MsgBox (用于输出结果)

1)、对2进行位运算之后,使结果为64。

2)、将0x2D041020高低位互换,即转换为0x10202D04。

3)、调用Random(-100, 100, 1)函数生成一个随机整数,并判断是否是偶数。

4)、调用Random(-100, 200, 1)函数生成一个随机整数,并判断是否为负数。

5)、判断随机数的最后3位是否为111,例如:
随机数为36615,其2进制为:
        36615(2)        0000 0000 0000 0000 1000 1111 0000 0111 最后3位为111,结果为True。
        36614(2)        0000 0000 0000 0000 1000 1111 0000 0110 最后3位为110,结果为False。

6)、$a、$b两变量的初始值分别为7和13,将$a、$b两变量的值相交换,即$a=13,$b=7,禁止引入第三个变量。

7)、将随机数第10位上的数取反,其他位不变。例如:
随机数为36615,右起第10位上的数取反之后,结果将是36103。计算如下:
        36615(2)        0000 0000 0000 0000 1000 1111 0000 0111
        36103(2)        0000 0000 0000 0000 1000 1101 0000 0111

8)、取随机数右边位连续的1,例如:
随机数为847,取右边连续的1,结果为15,计算如下:
        847(2)                0000 0000 0000 0000 0000 0011 0100 1111
        15(2)                0000 0000 0000 0000 0000 0000 0000 1111

9)、分别取-4和5的绝对值,禁止使用Abs函数。

10)、将右起第1位的数变为1,例如:
        4(2)                0000 0000 0000 0000 0000 0000 0000 0100
        5(2)                0000 0000 0000 0000 0000 0000 0000 0101

        ; 如果原本就是1,保持其位不变。
        5(2)                0000 0000 0000 0000 0000 0000 0000 0101
        5(2)                0000 0000 0000 0000 0000 0000 0000 0101
发表于 2010-9-26 14:05:07 | 显示全部楼层
本帖最后由 rolaka 于 2010-9-26 15:00 编辑

游客,如果您要查看本帖隐藏内容请回复

两题没有做出来... oh...有雷同的 都是巧合

评分

参与人数 1金钱 +80 收起 理由
pusofalse + 80 学习了。

查看全部评分

发表于 2010-9-26 14:29:19 | 显示全部楼层
本帖最后由 3mile 于 2010-9-26 16:20 编辑

只做到第九题。
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1金钱 +70 收起 理由
pusofalse + 70 学习了。

查看全部评分

发表于 2010-9-26 14:55:32 | 显示全部楼层
只做到第九题。
3mile 发表于 2010-9-26 14:29


我俩都忘记隐藏了...
发表于 2010-9-26 15:17:27 | 显示全部楼层
本帖最后由 C.L 于 2010-9-26 15:54 编辑

忘了用代码框了,更改一下

游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1金钱 +80 收起 理由
pusofalse + 80 学习了。

查看全部评分

发表于 2010-9-26 15:20:21 | 显示全部楼层
回复学习..
发表于 2010-9-26 15:34:19 | 显示全部楼层
本帖最后由 liufenglg 于 2010-9-26 15:39 编辑
**** 本内容被作者隐藏 ****
两题没有做出来... oh...有雷同的 都是巧合
rolaka 发表于 2010-9-26 14:05



    $t = Random(-100, 200, 1);Random(-100, 100, 1)
MsgBox(0, "0正1负->" & $t, BitAND(BitRotate($t, 1, "B"), 1))
这个有问题
不要B
$t = Random(-50000, 50000, 1);36615
MsgBox(0, "F&T->" & $t, BitAND(BitAND($t, 7), 1))
1为什么不换成7呢,结果为7就是
发表于 2010-9-26 15:36:54 | 显示全部楼层
本帖最后由 rolaka 于 2010-9-26 15:40 编辑
$t = Random(-100, 200, 1);Random(-100, 100, 1)
MsgBox(0, "0正1负->" & $t, BitAND(BitRotat ...
liufenglg 发表于 2010-9-26 15:34

奥 是d 不是b

被你误导了 8bits就够了

100的二进制是
1100100
在8bit之内的 没有问题
发表于 2010-9-26 15:44:46 | 显示全部楼层
$t = Random(-100, 200, 1);Random(-100, 100, 1)
MsgBox(0, "0正1负->" & $t, BitAND(BitRotat ...
liufenglg 发表于 2010-9-26 15:34

惯性思维罢了 相差了0.006ms而已
发表于 2010-9-26 16:02:16 | 显示全部楼层
这个题目很难啊,看看学习
发表于 2010-9-26 16:11:32 | 显示全部楼层
本帖最后由 liufenglg 于 2010-9-26 16:16 编辑

第9题
$a = -4
$b = 5
MsgBox(0, "", BitAND($a,7))
8

评分

参与人数 1金钱 +15 收起 理由
pusofalse + 15 感谢参与。

查看全部评分

发表于 2010-9-26 16:16:27 | 显示全部楼层
第9题
$a = -4
$b = 5
MsgBox(0, "", BitAND($a,7))
8
MsgBox(0, "", BitAND($a,0xffff))
liufenglg 发表于 2010-9-26 16:11

=.= 原来都是分开写的 我以为要用一个步骤来判断...
发表于 2010-9-26 16:56:36 | 显示全部楼层
看不懂题目的悄悄路过
发表于 2010-9-26 18:49:47 | 显示全部楼层
本帖最后由 shenrenba 于 2010-9-26 19:12 编辑

1: MsgBox(0,"",BitRotate(2,5))

2:想不出来

3:$str=Random(-100, 100, 1)
MsgBox(0,"0为偶数,1为奇数",$str&@CRLF&BitAND($str,1))

评分

参与人数 1金钱 +20 收起 理由
pusofalse + 20 感谢参与。

查看全部评分

 楼主| 发表于 2010-9-26 19:06:09 | 显示全部楼层
感谢诸位参与,代码都精彩极了,学习了~!

第8(取连续的1)、第9(求绝对值)题中,用到了一个+运算符,同样没符合要求。


; 1
MsgBox(0, BitShift(2, -5), "对2进行位运算之后,使结果为64。")

; 2
$iVar = BitOR(BitShift(0x2D041020, 16), BitShift(0x2D041020, -16))
MsgBox(0, Hex($iVar), "将0x2D041020高低位互换,即转换为0x10202D04。")

; 3
$iRandom = Random(-100, 100, 1)
MsgBox(0, BitAnd($iRandom, 1) <> 1, "判断" & $iRandom & "是否是偶数。")

; 4
$iRandom = Random(-100, 100, 1)
MsgBox(0, BitShift($iRandom, 31) <> 0, "判断" & $iRandom & "是否是负数。")

; 5
$iRandom = Random(-100, 100, 1)
MsgBox(0, BitAnd($iRandom, 7) = 7, "判断" & $iRandom & "的最后3位是否为111。")

; 6
Local $a = 7, $b = 13
$a = BitXOR($a, $b)
$b = BitXOR($a, $b)
$a = BitXOR($a, $b)
MsgBox(0, "a=" & $a & ", b=" & $b, "将$a、$b两变量的值相交换。")

; 7
$iRandom = Random(1, 100, 1)
MsgBox(0, BitXOR(BitShift(1, -9), $iRandom), "将" & $iRandom & "第10位上的数取反,其他位不变。")

; 8
$iRandom = 847
MsgBox(0, BitShift(BitXOR($iRandom, $iRandom + 1), 1), "取" & $iRandom & "右边位连续的1。")

; 9
$i = Random(-200, 100, 1)
$iVar = BitXOR(BitShift($i, 31), $i) + (BitShift($i, 31) <> 0)
MsgBox(0, $i & " -> " & $iVar, "取" & $i & "的绝对值,禁止使用Abs函数。")

; 10
$iRandom = Random(1, 100, 1)
MsgBox(0, BitOR($iRandom, 1), "将" & $iRandom & "右起第1位的数变为1。")

评分

参与人数 4金钱 +190 收起 理由
liufenglg + 30
Duvet + 30 學習了
rolaka + 80 8和9原来是这样的...
3mile + 50 精彩,学习了

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-27 02:36 , Processed in 0.106577 second(s), 32 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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