把整数转换成2的n次方的和数组
为什么80%的码农都做不了架构师?>>>
大概这样:125 => [1, 4, 8, 16, 32, 64]
写几种实现: Ruby:
2.3.1 :022 > 125.to_s(2).reverse.chars.map.with_index{|b, i| b.to_i.zero? ? nil : 2**i}.compact => [1, 4, 8, 16, 32, 64]
或者:
2.3.1 :028 > 125.to_s(2).reverse.chars.map.with_index{|b,i| b.to_i*2**i}.reject(&:zero?) => [1, 4, 8, 16, 32, 64]
Haskell: Haskell的整数转成二进制序列比较麻烦,先写一个函数来实现:
import Numeric (showHex, showIntAtBase)
import Data.Char (intToDigit)bits :: Int -> [Int]
bits x = map (\n -> read [n]::Int) $ showIntAtBase 2 intToDigit x ""
main = doprint $ bits 125
bits 函数用来将一个整数转换成 二进制的整数 数组 如 bits 125 => [1,1,1,1,1,0,1]
第二步,构造2的n次方序列[1,2,4,8,16...] 然后 将n次方序列和 反转后的二进制序列对应位相乘,最后过滤掉0。
main = doprint . filter (/=0) . zipWith (*) [ 2^n | n <- [0..] ] . reverse $ bits 125
Haskell利用位移算法实现,依赖Data.Bits
包里的 位与
和 右移
函数:
import Data.Bitsbits2 :: Int -> [Int]
bits2 x | x <=0 = []| otherwise = bits2 (shiftR x 1) ++ [x .&. 1]
-- bits2 函数即通过位移实现二进制List,由于需要reverse,所以下面实际用到的bits稍微修改。
-- bits2 返回的是二进制序列的倒序,避免里reverse一次。bitsList :: Int -> [Int]
bitsList x = filter (/=0) . zipWith (*) [2^n | n<-[0..] ] $ bits xwhere bits n | n <=0 = []| otherwise = n .&. 1 : bits (shiftR n 1)main = doprint $ bitsList 125
=> [1,4,8,16,32,64]
这样的实现方法似乎更加Haskell,
Js实现:
> (125).toString(2).split('').reverse().map((e,i) => parseInt(e) * Math.pow(2,i)).filter( e => e>0 )
[ 1, 4, 8, 16, 32, 64 ]
Js位移方法实现,每次右移1位,同时判断末尾是否位1,为1则,加入。
function bits(n) {var result = [];var m = 0;while (n > 0) {if (n & 1) {result.push(Math.pow(2, m));}m++;n >>= 1;}return result;
}console.log(bits(125));
> [ 1, 4, 8, 16, 32, 64 ]
或者写成for,简单一些
function bits(n) {var result = [];for (var m = 0; n > 0; m++, n >>= 1) {if (n & 1) {result.push(Math.pow(2, m)); // es7: 2**m}}return result;
}
es7支持 指数运算符 **,es6还不支持,chrome浏览器已经支持,更加简化。
Julia
# 复合函数,(Julia >=0.6版本,已经内置该函数,so easy!)
∘(f::Function, g::Function) = x -> f(g(x))function binaryLists(n::Int)b = [x for x in lstrip(bits(n), '0')]filter(x->x>0, map(*, [2^y for y=0:length(b)-1], map(parse ∘ string, reverse(b))))
endprint(binaryLists(125))=> [1,4,8,16,32,64]
julia在这个问题上处理有些复杂,无法轻松构造出一个无限列表,map针对多个List参数时候,必须保证所有List长度一致,这点区别于Haskell的 zipWith
,zipWith两个列表按最短的为准,忽略多余的。为了简化代码定义了一个复合函数(∘
),这样就不用写 x-> parse(string(x))
julia支持两个List直接用 list1 .* list2
来相乘对应位,可以替换 map(*, list1, list2)
function binaryLists(n::Int)b = [x for x in lstrip(bits(n), '0')]filter(x->x>0, [2^y for y=0:length(b)-1] .* map(parse ∘ string, reverse(b)))
end
适当化简一些。
转载于:https://my.oschina.net/jsk/blog/742036
把整数转换成2的n次方的和数组相关推荐
- c语言中将整数转换成字符串_在C语言中将ASCII字符串(char [])转换为八进制字符串(char [])...
c语言中将整数转换成字符串 Given an ASCII string (char[]) and we have to convert it into octal string (char[]) in ...
- c语言中将整数转换成字符串_在C语言中将ASCII字符串(char [])转换为十六进制字符串(char [])...
c语言中将整数转换成字符串 Given an ASCII string (char[]) and we have to convert it into Hexadecimal string (char ...
- 计蒜客挑战难题:整数转换成罗马数字
给定一个整数num,( 1<=num<=3999),将整数转换成罗马数字. 如1,2,3,4,5对应的罗马数字分别位I,II,III,IV,V等. 格式: 第一行输入一个整数,接下来输出对 ...
- c语言 整数转二进制取位,C语言位运算--将整数转换成二进制串以及反转整数后N位...
// c primer plus上的内容,位运算 #include char * itobs (int n,char * ps); void show_bstr(const char *); int ...
- 1.实现将整数转换成字符串
将一个整数转换成字符串,拿到这个题目首先想到标准库里提供了哪些可用的函数. 如果是在window下编程,可以用系统库函数itoa实现该功能,itoa函数原型如下: char* itoa(int val ...
- 如何把一个整数转换成二进制
下面介绍一种把键盘输入的整数转换成二进制的方法:程序如下: #include <stdio.h>void int2bin1(int num) {int i;for(i = 1; i < ...
- 将任意的十进制整数转换成任意R进制数(R在2-16之间)
在c语言中,编程实现将任意的十进制整数转换成任意R进制数(R在2-16之间),源码如下所示: #include <stdio.h> int main(){ void change( ...
- 实现 十进制整数转换成二进制,八进制,十六进制
整型有4种进制形式: 1.十进制: 都是以0-9这九个数字组成,不能以0开头. 2.二进制: 由0和1两个数字组成. 3.八进制: 由0-7数字组成,为了区分与其他进制的数字区别,开头都是以0开始. ...
- 把一个整数转换成十六进制数
把一个整数转换成十六进制数 public class Test {public static void main(String[] args) {String s = decChangeHex(125 ...
最新文章
- Flutter学习之”相对布局“
- MySQL 时间类型 DATE、DATETIME和TIMESTAMP
- 分区报无效的参数_西门子70系列变频器55KW上电就报F002故障维修
- 开源纯C#工控网关+组态软件(九)定制Visual Studio
- Qt学习笔记-Qt Graphic View Framework
- 在一台物理服务器上搭建VSAN实验测试
- [Extjs 4] 类系统
- MR案例:输出/输入SequenceFile
- cenyos7安装 yum不可用_centos7安装fabric
- android create命令,phonegap运行android – create命令失败,退出代码8 – linux
- python遗传算法(详解)
- oracle用户LOCKED(TIMED)原因及解决
- python是动态语言图片_利用python图片生成,需10几行代码,生成的动态表情包(小黄鸭)...
- 如何接入中国工商银行网上银行B2C在线支付接口
- Linux内核版本主要有,Linux内核版本号主要有几部分组成? 各代表什么含义?
- 微信公众平台编辑模式
- 计算机管理器用户怎么打开文件,资源管理器怎么设置默认打开我的电脑
- C#ObjectArx Cad创建点线块
- php登录后不点击注销,icloud无密码强制注销的方法
- W51 - 999、电影评价数据的采集
热门文章
- web 容器 支持 php,web服务器lighttpd 对php的支持
- mysql 函数的参数_MySQL中的数值函数
- 路由ssr服务器信息不完整,基于Nuxt构建动态路由SSR服务
- 在工作中有被动转主动的体会_积极主动应对眼前的一切,就是对自己最好的犒赏...
- 长连接测试_如何选择好一根测试电缆组件?
- 简述使用混合传递参数时的基本原则_JUnit 5参数化方法测试(一)
- php controller 间调用,php – 在CodeIgniter中的另一个Controller中调用Controller函数
- 如何解决notefirst的闪退问题?
- 中消协:警惕以治病为噱头的保健品虚假宣传行为
- PostgreSQL在何处处理 sql查询之三十九