190. 颠倒二进制位

地址:https://leetcode-cn.com/problems/reverse-bits/

<?php

/**
颠倒给定的 32 位无符号整数的二进制位。

 

示例 1:

输入: 00000010100101000001111010011100
输出: 00111001011110000010100101000000
解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
示例 2:

输入:11111111111111111111111111111101
输出:10111111111111111111111111111111
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
     因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-bits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
class Solution {
    /**

    参考:http://www.hishenyi.com/archives/1356
    1、首先要有2个变量,
    1)临时变量叫做  $xxoo , 初始值是0(十进制),二进制也就是00000000
    2)原始值 变量,叫做$shit , 就是要做处理的 00000101

    2、3个步骤
    1) 把$xxoo 左移 一位
    2) 判断 $shit的二进制值最后一位 是不是1,如果是 ,则给$xxoo的十进制值加1 ,这个很重要 看成二进制就是把00000000 变成 00000001
    否则 $xxoo 初始值是00000000, 这个进行移位移个屁啊。。。 都是零
    那么 tmd怎么判断二进制最后一位是不是1?  你要通过截取字符串或正则判断 算你牛逼(不是不可以哦)

    答:只要把原值和 1(也就是00000001) 进行 逻辑与操作 (1&1 才是1 ,1&0 或0&1 一律是0)

    3) 接下来把$shit 右移 1位  ,如原来是 00000101 ,移动后变成了 00000010

    (也就是说$xxoo和shit同时移,一个左一个右,当shit最后一位是1的时候能被我们判断到,于是给$xxoo的末位也置为1,这样就能实现xxoo和shit既同步又相反)

    上面的过程反复执行8 次,就能得到10100000
     */

    function reverseBits1($n) {
        $xxoo = 0;
        for ($i = 0; $i < 32; $i++) {
            $xxoo = $xxoo << 1;

            if (($n & 1) == 1) {
                $xxoo++;
            }

            $n = $n >> 1;

        }
    return $xxoo;
    }
}
$soluition = new Solution();
var_dump($soluition->reverseBits(11111111111111111111111111111101));

 

posted @ 2020-06-04 16:32  花花妹子。  阅读(164)  评论(0编辑  收藏  举报