将十进制转换为二进制幂 bi
Posted
技术标签:
【中文标题】将十进制转换为二进制幂 bi【英文标题】:Converting Decimal to Binary Power bi 【发布时间】:2017-10-23 05:19:03 【问题描述】:我有一个包含十进制数字 1 到 14 的列名 Config。我想创建一个新列 config2 并将 config 列转换为二进制 (base2)。
例如。 config2 =(配置二进制(base2))
*Config |Config2*
1 |0001
2 |0010
3 |0011
这是我的数据的样子
【问题讨论】:
【参考方案1】:您可以在 Power Query / M 中使用递归来实现。
Bin = (t as text, n as number) =>
if n <= 1
then Text.From(n) & t
else @Bin(Text.From(Number.Mod(n, 2)) & t, Number.RoundDown(n/2))
注意Bin
之前的@
,它可以使递归发生。
结果:
我的查询供您参考:
let
Bin = (t as text, n as number) => if n <= 1 then Text.From(n) & t else @Bin(Text.From(Number.Mod(n, 2)) & t, Number.RoundDown(n/2)),
Source = 0..14,
#"Converted to Table" = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Renamed Columns" = Table.RenameColumns(#"Converted to Table","Column1", "Config"),
#"Changed Type" = Table.TransformColumnTypes(#"Renamed Columns","Config", Int64.Type),
#"Added New Column" = Table.AddColumn(#"Changed Type", "Config2", each Bin("", [Config]))
in
#"Added New Column"
如果您需要将前导零填充到 Config2
,那么您将需要以下 DAX:
Formatted Config2 = FORMAT(VALUE(Query1[Config2]), "0000")
结果:
【讨论】:
【参考方案2】:下面的函数能够将数值转换为字符串,用另一个基数表示数字,反之亦然。您可以使用碱基 2-16、32 和 64。
示例,如果您将函数命名为 NumberBaseConversion:
= NumberBaseConversion(12, 2, 5) 返回“01100”
= NumberBaseConversion("AB", 16) 返回 171
(input as anynonnull, base as number, optional outputlength as number) as any =>
let
// input = 10,
// base = 2,
// outputlength = null,
Base16 = "0123456789ABCDEF",
Base32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
Lookups = List.Zip(16,32,64,Base16,Base32,Base64),
Lookup = Text.ToList(List.Last(List.Select(Lookups,each _0 <= List.Max(16, base)))1),
InputToList = Text.ToList(input),
// This part will be executed if input is text:
Reversed = List.Reverse(InputToList),
BaseValues = List.Transform(Reversed, each List.PositionOf(Lookup,_)),
Indexed = List.Zip(BaseValues, 0..Text.Length(input)-1),
Powered = List.Transform(Indexed, each _0*Number.Power(base,_1)),
Decimal = List.Sum(Powered),
// So far this part
// This part will be executed if input is not text:
Elements = 1+Number.RoundDown(Number.Log(input,base),0),
Powers = List.Transform(List.Reverse(0..Elements - 1), each Number.Power(base,_)),
ResultString = List.Accumulate(Powers,
[Remainder = input,String = ""],
(c,p) => [Remainder = c[Remainder] - p * Number.RoundDown(c[Remainder] / p,0),
String = c[String] & LookupNumber.RoundDown(c[Remainder]/p,0)])[String],
PaddedResultString = if outputlength = null then ResultString else Text.PadStart(ResultString,outputlength,Lookup0),
// So far this part
Result = if input is text then Decimal else PaddedResultString
in
Result
【讨论】:
以上是关于将十进制转换为二进制幂 bi的主要内容,如果未能解决你的问题,请参考以下文章