为什么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次方的和数组相关推荐

  1. c语言中将整数转换成字符串_在C语言中将ASCII字符串(char [])转换为八进制字符串(char [])...

    c语言中将整数转换成字符串 Given an ASCII string (char[]) and we have to convert it into octal string (char[]) in ...

  2. c语言中将整数转换成字符串_在C语言中将ASCII字符串(char [])转换为十六进制字符串(char [])...

    c语言中将整数转换成字符串 Given an ASCII string (char[]) and we have to convert it into Hexadecimal string (char ...

  3. 计蒜客挑战难题:整数转换成罗马数字

    给定一个整数num,( 1<=num<=3999),将整数转换成罗马数字. 如1,2,3,4,5对应的罗马数字分别位I,II,III,IV,V等. 格式: 第一行输入一个整数,接下来输出对 ...

  4. c语言 整数转二进制取位,C语言位运算--将整数转换成二进制串以及反转整数后N位...

    // c primer plus上的内容,位运算 #include char * itobs (int n,char * ps); void show_bstr(const char *); int ...

  5. 1.实现将整数转换成字符串

    将一个整数转换成字符串,拿到这个题目首先想到标准库里提供了哪些可用的函数. 如果是在window下编程,可以用系统库函数itoa实现该功能,itoa函数原型如下: char* itoa(int val ...

  6. 如何把一个整数转换成二进制

    下面介绍一种把键盘输入的整数转换成二进制的方法:程序如下: #include <stdio.h>void int2bin1(int num) {int i;for(i = 1; i < ...

  7. 将任意的十进制整数转换成任意R进制数(R在2-16之间)

    在c语言中,编程实现将任意的十进制整数转换成任意R进制数(R在2-16之间),源码如下所示: #include <stdio.h> int main(){     void change( ...

  8. 实现 十进制整数转换成二进制,八进制,十六进制

    整型有4种进制形式: 1.十进制: 都是以0-9这九个数字组成,不能以0开头. 2.二进制: 由0和1两个数字组成. 3.八进制: 由0-7数字组成,为了区分与其他进制的数字区别,开头都是以0开始. ...

  9. 把一个整数转换成十六进制数

    把一个整数转换成十六进制数 public class Test {public static void main(String[] args) {String s = decChangeHex(125 ...

最新文章

  1. Flutter学习之”相对布局“
  2. MySQL 时间类型 DATE、DATETIME和TIMESTAMP
  3. 分区报无效的参数_西门子70系列变频器55KW上电就报F002故障维修
  4. 开源纯C#工控网关+组态软件(九)定制Visual Studio
  5. Qt学习笔记-Qt Graphic View Framework
  6. 在一台物理服务器上搭建VSAN实验测试
  7. [Extjs 4] 类系统
  8. MR案例:输出/输入SequenceFile
  9. cenyos7安装 yum不可用_centos7安装fabric
  10. android create命令,phonegap运行android – create命令失败,退出代码8 – linux
  11. python遗传算法(详解)
  12. oracle用户LOCKED(TIMED)原因及解决
  13. python是动态语言图片_利用python图片生成,需10几行代码,生成的动态表情包(小黄鸭)...
  14. 如何接入中国工商银行网上银行B2C在线支付接口
  15. Linux内核版本主要有,Linux内核版本号主要有几部分组成? 各代表什么含义?
  16. 微信公众平台编辑模式
  17. 计算机管理器用户怎么打开文件,资源管理器怎么设置默认打开我的电脑
  18. C#ObjectArx Cad创建点线块
  19. php登录后不点击注销,icloud无密码强制注销的方法
  20. W51 - 999、电影评价数据的采集

热门文章

  1. web 容器 支持 php,web服务器lighttpd 对php的支持
  2. mysql 函数的参数_MySQL中的数值函数
  3. 路由ssr服务器信息不完整,基于Nuxt构建动态路由SSR服务
  4. 在工作中有被动转主动的体会_积极主动应对眼前的一切,就是对自己最好的犒赏...
  5. 长连接测试_如何选择好一根测试电缆组件?
  6. 简述使用混合传递参数时的基本原则_JUnit 5参数化方法测试(一)
  7. php controller 间调用,php – 在CodeIgniter中的另一个Controller中调用Controller函数
  8. 如何解决notefirst的闪退问题?
  9. 中消协:警惕以治病为噱头的保健品虚假宣传行为
  10. PostgreSQL在何处处理 sql查询之三十九