From 490417faa1576ede5e60a42d313fd3d8e0c37cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=93=E5=8F=91=E5=8F=97=E9=95=BF=E7=94=9F?= Date: Mon, 27 Aug 2018 00:54:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E8=BF=9B=E5=88=B6=E6=9C=89=E5=85=B3?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=B8=A4=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/_posts/react/react-native(1)-初见.md | 4 +- source/_posts/算法/二进制有关问题两则.md | 96 +++++++++++++++++++++ 2 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 source/_posts/算法/二进制有关问题两则.md diff --git a/source/_posts/react/react-native(1)-初见.md b/source/_posts/react/react-native(1)-初见.md index 10cb847..6f896c3 100644 --- a/source/_posts/react/react-native(1)-初见.md +++ b/source/_posts/react/react-native(1)-初见.md @@ -22,7 +22,7 @@ React Native 使用Javascript语言,类似于HTML的JSX,以及CSS来开发 ```bash npm install -g react-native-cli ``` -#### android-stdio +#### android-studio 由于react-native项目需要在安卓模拟器当中运行 首先需要 [下载](http://www.android-studio.org/) 安装android-stdio @@ -38,7 +38,7 @@ npm install -g react-native-cli ![创建安卓模拟器](/images/react/Android_Virtual_Device.png) ##### 启动安卓模拟器 -我们可以直接在android stdio里面运行这个刚才创建好的模拟器 +我们可以直接在android studio里面运行这个刚才创建好的模拟器 也可以在命令行运行 在安装sdk的目录下, 会有一个emulator目录 模拟器的运行程序就在这个目录当中 diff --git a/source/_posts/算法/二进制有关问题两则.md b/source/_posts/算法/二进制有关问题两则.md new file mode 100644 index 0000000..683a22c --- /dev/null +++ b/source/_posts/算法/二进制有关问题两则.md @@ -0,0 +1,96 @@ +--- +title: 二进制有关问题两则 +date: 2018-5-26 22:11:54 +tags: + - 算法 +categories: + - 算法 +--- + +### 题目1 +有100瓶水, 其中一瓶有毒, 老鼠喝了有毒的水一周后就会死亡 +问至少用多少只老鼠才能在一周内试出哪瓶水是有毒的 + + + +#### 解答 +这个问题可以使用`二进制`方式去解决 +先说这道题得出答案的统一方法, 总共有多少瓶水, 把这个数字-1后转化为2进制 +99转化为二进制就是1100011 +这个二进制数有7位, 那么就需要7只老鼠 + +#### 具体操作方法 +将这100瓶水从0开始编号直到99 +每一瓶水对应编号的二进制数如下表所示 + +| 十进制数 | 二进制数 | +|---|---| +|0|0 0 0 0 0 0 0| +|1|0 0 0 0 0 0 1| +|2|0 0 0 0 0 1 0| +|3|0 0 0 0 0 1 1| +|...|...| +|99|1 1 0 0 0 1 1| + +现在让每一只老鼠对应二进制中的一位 +如果这一位上是1, 那么就喝这瓶中的水, 如果是0就不喝 +等到最后一天看这7只老鼠当中有哪些死亡 +如果某一位上的老鼠存活, 那么代表有毒水编号的这一位是0, 反之则是1 + +比如第2,5,6,7位置上的老鼠死亡, 其他存活 +则代表有毒水的编号是0100111 +那么转化为十进制就是39 + +### 题目2 +有100个囚犯站成一排, 从1开始报数, 奇数枪毙, 偶数留下 +剩下的人继续按照该规则进行, 直到最后剩下1个人释放 +问开始的时候站在哪个位置可以最终活下来 + +#### 解答 +可以采取倒推的方式 +最后活下来的人, 在最后一轮必定是站在第2位 +在倒数第二轮必定是站在第4位 +在倒数第三轮必定是站在第8位 +依此类推, 16 32 64 +100以内2的幂次方最大就是64了, 所以是开始的时候站在64位的人最终存活 + +> 简单来说, 就是每一轮执行过去之后, 如果自己存活, 那么自己的序号就会除以2 +每一轮结束之后都要保证自己所在的位置是偶数或者是1 +只有2的幂次方的数可以满足此条件 +并且在总数人>=2的情况下, 自己的序号不会变成1 +只有总人数里面的最大的2的幂次方可以满足此条件 + + +### 补码 +补码是整数在内存当中的存储方式 ++ 原码: 最高位是符号位, 1表示负数, 0表示正数, 后面的位是这个数的绝对值 ++ 补码: 正数的补码与原码相同, 负数的补码就是对该负数的绝对值求反加1, 0的补码是0 + +比如一个byte类型的变量, 它是1个字节, 也就是8位 +最大的正数很容易想到, 就是`0 1 1 1 1 1 1 1`, 它表示127 + +0的补码就是 `0 0 0 0 0 0 0 0` + +要求一个负数的补码 +比如-2 +那么要先对该数求绝对值, 就是2, 2对应的原码是 `0 0 0 0 0 0 1 0` +再+1就是`0 0 0 0 0 0 1 1`, 它就是-2的补码 + +那么已知一个补码, 怎么求对应的十进制数呢? +首先看最高位判断正负, 如果是0, 那么它是个正数, 正数就是二进制转化十进制的基本规则 +这个很简单 +如果是1, 那么它是个负数 +巧妙之处就在于同样可以套用这个规则, 也可以逆向套用, 结果都一样 + +**直接套用规则** +比如`1 1 1 1 1 1 1 1` , 取反就是`0 0 0 0 0 0 0 0`再+1是`0 0 0 0 0 0 0 1` +这个数表示+1, 它是最初负数的绝对值, 那么最初的负数就是-1 +**逆向套用规则** +`1 1 1 1 1 1 1 1` , 先-1就是`1 1 1 1 1 1 1 0`再取反是`0 0 0 0 0 0 0 1` +结果是相同的 + +在8位的范围内, 能表示的最小负数是`1 0 0 0 0 0 0 0` +同样套用上述规则, 它表示-128 + +所以byte类型变量的范围就是 -128 ~ +127 +更大容量的变量类型, char是2个字节, int是4个字节, 只要是整数, 计算方式都是相同的 \ No newline at end of file