开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1016|回复: 14
收起左侧

[讨论] 不用循环且尽量少的代码判断数值是否是2的n次方

[复制链接]

结帖率:100% (9/9)
发表于 2024-3-6 10:24:28 | 显示全部楼层 |阅读模式   广西壮族自治区崇左市

规则:
1. 不能使用循环, 调用的命令内部有也不行
2. 只能使用基础数值运算符和位运算
3. 尽量减少代码量

基础数值运算符只有
加法 减法 乘法 除法 求余数

简单说一下题目解法方向
再简单的说一下2的次方在二进制上有什么变化
0000 0000 0000 0000 0000 0000 0000 0000
这里是32个位, 从右边往左边数, 0-31, 一共32位, 2的n次方就是对应的位是1
比如, 2的17次方, 那就是从右往左数到第17位, 从0开始数, 第17位为1, 其他都为0
0000 0000 0000 0010 0000 0000 0000 0000


再比如, 2的0次方, 那就是第0位为1
0000 0000 0000 0000 0000 0000 0000 0001


也可以这样理解, 2的n次方的二进制 = 1+n个0


现在知道了2的n次方的二进制是这样的
那是不是可以判断我这个二进制只有一个位为1就是2的n次方了吗
所以这题的解法就是如何判断某个数值是否只有一个位为1

下面是我的代码, 请自己想之后再来看我的代码
我的代码很简单, 就3行

  
子程序名返回值类型公开备 注
是否是2的n次方逻辑型 
参数名类 型参考可空数组备 注
n整数型
如果真 (n = 0)
返回 ()
返回 (位与 (n, n - 1) = 0)

  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
数值整数型 
结果逻辑型 
信息框文本文本型 
信息框标题文本型 
信息框图标整数型 
数值 = 到整数 (编辑框1.内容)
结果 = 是否是2的n次方 (数值)
信息框文本 = “输入数值10进制: ”到文本 (数值)#换行符
信息框文本 = 信息框文本 + “输入数值16进制: 0x”取文本右边 (“00000000”取十六进制文本 (数值), 8)#换行符
信息框文本 = 信息框文本 + “输入数值二进制: ”到二进制 (数值)#换行符
判断 (结果)
信息框标题 = “是2的n次方”
信息框图标 = #信息图标
信息框标题 = “不是2的n次方”
信息框图标 = #错误图标
信息框 (信息框文本, 信息框图标, 信息框标题, 取窗口句柄 ())
子程序名返回值类型公开备 注
是否是2的n次方逻辑型 
参数名类 型参考可空数组备 注
n整数型
' 写下你的代码
返回 ()
子程序名返回值类型公开备 注
到二进制文本型 方便输出数值的二进制
参数名类 型参考可空数组备 注
十进制数整数型
变量名类 型静态数组备 注
bit字节集 
i整数型 
bit = 取重复字节集 (32, { 48 })  ' 48="0"
计次循环首 (32, i)
如果真 (__query_bit (十进制数, i - 1))
bit [32 - i + 1] = 49  ' 49="1"

计次循环尾 ()
返回 (到文本 (bit))
子程序名返回值类型公开备 注
__query_bit逻辑型 cha询一个整数 32位中的某一位是否为 1  @福仔
参数名类 型参考可空数组备 注
num整数型
bit字节型只支持 0 - 31, 越界返回假
置入代码 ({ 138, 77, 12, 51, 192, 128, 249, 32, 115, 14, 139, 69, 8, 133, 192, 116, 7, 51, 219, 67, 211, 227, 35, 195, 201, 194, 8, 0 })
' mov cl, [ebp+12]
' xor eax,eax
' cmp cl, 32
' jae exit    ; 位数大于等于32则返回
' mov eax, [ebp+8]
' test eax,eax
' jz exit     ; 参数1位0返回0
' mov ebx, 1
' shl ebx, cl
' and eax, ebx
' exit:
' leave
' ret 8
' 返回 (位与 (a, 左移 (1, offset)) ≠ 0)' 与上面的汇编效果差不多
返回 ()


上传一个模板源码, 源码比上面贴出的代码就多了个界面而已
是否是2的n次方.e (5.69 KB, 下载次数: 2)

点评

调试输出 (求自然对数 (64) ÷ 求自然对数 (2) % 1 = 0)   重庆市重庆市  发表于 2024-3-6 12:06
结帖率:75% (9/12)

签到天数: 1 天

发表于 2024-3-31 13:06:29 | 显示全部楼层   广东省广州市
66666666666666666666
回复 支持 反对

使用道具 举报

发表于 2024-3-15 02:46:30 | 显示全部楼层   湖南省衡阳市
看看!!!!!!!
回复 支持 反对

使用道具 举报

结帖率:100% (15/15)

签到天数: 15 天

发表于 2024-3-8 20:27:33 | 显示全部楼层   河南省新乡市
研究一下
回复 支持 反对

使用道具 举报

结帖率:94% (17/18)

签到天数: 18 天

发表于 2024-3-6 14:07:09 | 显示全部楼层   山东省烟台市
-2147483648算不算2的n次方呢

点评

肯定算啊, 这个数只有一个位是1, 只有一个位是1的都是2的n次方   广西壮族自治区崇左市  发表于 2024-3-6 14:09
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 21 天

发表于 2024-3-6 13:04:51 | 显示全部楼层   山东省*
明天自然醒 发表于 2024-3-6 12:14
很明显楼上没考虑有符号整数的情况,负数就会判错
按照规则,不使用循环,我也不使用基础运算,我 ...

牛逼,手写穷举
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 24 天

发表于 2024-3-6 12:32:30 | 显示全部楼层   湖北省孝感市
bool isPowerOfTwo(int n) {  
    return n > 0 && (n & (n - 1)) == 0;  
}  
回复 支持 反对

使用道具 举报

结帖率:100% (47/47)

签到天数: 24 天

发表于 2024-3-6 12:14:48 | 显示全部楼层   江西省南昌市
很明显楼上没考虑有符号整数的情况,负数就会判错
按照规则,不使用循环,我也不使用基础运算,我直接查表
switch(){
}
判断()
分支...

考虑到整数型实在太小了,也就是几十种情况,不知道有没有更快的

点评

牛逼,手写穷举   山东省*  详情 回复 发表于 2024-3-6 13:04
回复 支持 反对

使用道具 举报

结帖率:90% (9/10)

签到天数: 25 天

发表于 2024-3-6 12:05:52 | 显示全部楼层   重庆市重庆市
调试输出 (求自然对数 (64) ÷ 求自然对数 (2) % 1 = 0)
回复 支持 反对

使用道具 举报

结帖率:91% (67/74)

签到天数: 25 天

发表于 2024-3-6 11:17:21 | 显示全部楼层   四川省乐山市
支持大佬
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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