签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
前几天被人考问 如何 计算整数或者WORD 里面有多少个1 ,
用来做报警信息,其实我不这样用, 既然问到了写一个证明我会计算整数里面有多少个一。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1796815&b_id=66&s_id=0&num=37
对滴,楼主的观点赞同。
不认同这种方式.....每次减1真的是浪费......... 再者修改了输入的数据...
也可以做成无固定数据类型的FC。
互相交流,不错的方法
感谢楼主分享,非常简单的方式,开拓了思路。但是这个思路的原理 我不理解,为什么要和它少1的那个数相与?
计数+1
1010-1=1001;1010 & 1001 =1000;
<>0 计数+1
1000-1=0111; 1000 & 0111=0; 结果为0 输出 2
原理是:-1只会影响最后不为零的位。
比FOR全判断要快。效率高
例如:0011 0000-1=0010 1111 &之后 为0010 0000;
感觉 你完全没明白 这是最高效的方式,for 循环是所有人第一个想到的
我们写程序 一定要用最优的方式。
不是能跑就行。每一个地方都写到极致 合起来就没有bug 。
随手写的,要理解到本质。
这个很有启发,楼主是不断把最右边的1变成0。
如果不断把最右边的0变成1呢?
REGION BLOCK INFO HEADER
#FC_BitCountInt := 0;
REGION Bit Count
WHILE #n <>16#FFFFFFFF DO //假设n是DWORD.
#n := #n OR (#n + 1);
#FC_BitCountInt += 1;
END_WHILE;
#FC_BitCountInt := 32- #FC_BitCountInt;
END_REGION
感谢分享,又学到了,这个是不是也是从高级语言算法里面的恩路呀
引用5楼详细内容:
理解了很久,-1就是向是1的位借1。
如果最后位是1,那么借完后,位为0。如果最后位为0,向左侧最近的是1的位借1,借完后这个位变成0。与运算的目的是将 借位后的位清0,然后继续下一次借位。
那么这个方法能不能再扩展一下,问题改成 任意一个数 求个位、百位、千位、万位......不是0的数有几个?
或者再详细一点,是1的数 是2的数 是3的数 有几个? 能否也借鉴这个思路
不是有BITSUM指令?
挻不错的。Idea很重要,不要事后诸葛亮。拿出另一种方案跟楼主的方案PK下。
一般都喜欢自己写,不过指令也是算法 人家西门子封装好的。
https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1769301&b_id=66&s_id=0&num=0#anch
LZ,看下我这个方法呢……一起交流下呢
这个只能说效率很高, 最高谈不上。
效率最高的是 相邻位相加, 相邻两位相加, 相邻4位相加, 相邻8位相加。
这种。
感谢分享!鼓掌!
感谢楼主分享
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录