You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言中实现给定数值的2的幂组合二进制矩阵输出

R语言:将组合值分解为2的幂并生成二进制矩阵

需求说明

现有两个数据框:

  • 数据框1:包含20到231的所有幂值(1、2、4…2147483648)
  • 数据框2:包含待分解的组合值(如20、50)

需要将每个组合值分解为2的幂之和,生成一个二进制矩阵:每一行对应一个组合值,每一列对应一个2的幂,若组合值包含该幂则标记1,否则标记0。


完整实现代码

基础版本(处理常规整数,若需支持2^31则看进阶版本)

# 1. 生成数据框1:包含2^0到2^31的幂值及对应指数
pow2_values <- 2^(0:31)
pow2_df <- data.frame(
  power_value = pow2_values,
  exponent = 0:31
)

# 2. 示例数据框2(替换为你的实际数据)
comb_df <- data.frame(combination = c(20, 50))

# 3. 定义分解函数:用位运算判断每个2的幂是否属于组合值的组成部分
decompose_to_pow2 <- function(x, pow2_vec) {
  # 位运算x & pow2_vec:若结果非0,说明该幂是x的组成部分
  as.integer((x & pow2_vec) != 0)
}

# 4. 批量处理生成二进制矩阵
result_matrix <- t(sapply(comb_df$combination, decompose_to_pow2, pow2_vec = pow2_values))

# 5. 转换为数据框并设置列名
result_df <- as.data.frame(result_matrix)
colnames(result_df) <- paste0("2^", 0:31)

# 6. 合并原组合值与结果(可选,方便对应查看)
final_result <- cbind(comb_df, result_df)

# 查看结果(仅展示前7列示例)
head(final_result[, 1:7])

进阶版本(支持2^31,避免整数溢出)

由于231(2147483648)超出了R默认32位整数的范围(最大值为231-1),如果你的组合值包含2^31,需要用bit64包处理64位整数:

library(bit64)

# 1. 生成64位整数类型的2的幂
pow2_values <- as.integer64(2)^(0:31)
pow2_df <- data.frame(
  power_value = pow2_values,
  exponent = 0:31
)

# 2. 将数据框2的组合值转为64位整数
comb_df <- data.frame(combination = as.integer64(c(20, 50, 2147483648)))

# 3. 适配64位整数的分解函数
decompose_to_pow2 <- function(x, pow2_vec) {
  as.integer((bitwAnd(x, pow2_vec)) != 0)
}

# 后续步骤同基础版本
result_matrix <- t(sapply(comb_df$combination, decompose_to_pow2, pow2_vec = pow2_values))
result_df <- as.data.frame(result_matrix)
colnames(result_df) <- paste0("2^", 0:31)
final_result <- cbind(comb_df, result_df)

代码说明

  • 位运算效率:使用x & pow2_vec是判断2的幂组成的最高效方式,比循环取余/除法快得多,尤其适合处理大量数据。
  • 列命名:用paste0("2^", 0:31)直接生成对应幂的列名,清晰直观。
  • 64位整数处理:当需要支持2^31时,bit64包的integer64类型可以避免整数溢出问题,bitwAnd是64位整数的位与运算函数。

内容的提问来源于stack exchange,提问作者Rajesh Addunuri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:30:55