素材牛VIP会员
位运算如何拆分
 飞***a  分类:PHP代码  人气:1017  回帖:7  发布于6年前 收藏

举例,比如说下面可以组合成7

1|2|4;    // 7

那么比如我给一个15,怎么拆分成:1、2、4、8,或者是任意其他数,怎么进行拆分

 标签:php

讨论这个帖子(7)垃圾回帖将一律封号处理……

Lv6 码匠
小***6 JS工程师 6年前#1

Javascript版的算法:

function split(n) {
  n = n|0; // 将浮点数n转化为正整数
  let pad = 0;
  const arr = []; // 用于保存结果的数组
  while(n) {
    if (n&1) arr.push(1<<pad);
    pad++;
    n >>= 1;
  }
  return arr;
}

对应的 PHP 版本:

function split($n) {
    $n |= 0;
    $pad = 0;
    $arr = array();
    while ($n) {
        if ($n & 1) array_push($arr, 1 << $pad);
        $pad++;
        $n >>= 1;
    }
    return $arr;
}
Lv3 码奴
45***73 CEO 6年前#2

不熟悉php。可以先确定这个数占多少位,比如64或者32等。然后再左移位,按位与来解决。写了个python的。xrange的意思是从64开始递减到0,每次递减1.
这里假定是64位,符号位就不考虑了。

dest_num = 11
for i in xrange(64, -1, -1):
    n = 1 << i
    r = n & dest_num
    if r != 0:
        print r

应该很容易改造成php的。

Lv4 码徒
想***儿 技术总监 6年前#3

其实你要就是一个数字的二进制表示
比如
15实际上是1111, 最右边1是12^0=1, 从右向左第二个是12^1=2, 第三个是12^2=4, 第四个是12^3=8

22用二进制是10110, 02^0+12^1+12^2+02^3+1*2^4 = 0+2+4+0+16 = 22

整数到二进制的做法是用除二法
22/2 = 11 ..... 0
11/2 = 5 ..... 1
5/2 = 2 ..... 1
2/2 = 1 ..... 0
1/2 = 0 ..... 1
一直除到为0, 余数10110就是它的二进制数

Lv6 码匠
无***圣 职业无 6年前#4

15 的二进制是:1111
1 的二进制是:0001
2 的二进制是:0010
4 的二进制是:0100
8 的二进制是:1000

看懂了吗?
运算就是把对应位置的1组合到一起。

Lv4 码徒
Su***er JS工程师 6年前#5

可以使用decbin方法 参考手册

首先得出二进制数,然后字符串操作依次读取
如 decbin(7) => 111
从右开始算,依次得出:
第一位可以得出2^(1-1)=1
第二位可以得出2^(2-1)=2
第三位可以得出2^(3-1)=4

同理:
decbin(15) => 1111 => 1|2|4|8
decbin(13) => 1101 => 1|4|8

Lv3 码奴
lo***ng PHP开发工程师 6年前#6

用移位来做应该会好一些,把有效位抽出来

Lv4 码徒
gy***23 JAVA开发工程师 6年前#7
def decrypt(n):
    arr = []
    i = 0
    while n > 0:
        x = n % 2
        n >>= 1
        if x == 1:
            arr.append(i)
        i += 1
    return arr
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取