tags
date
type
status
slug
category
summary
password
icon
强推我左神好吧!B站搜左程云!!!
算法讲解002【入门】从社会实验到入门提醒
实验:
- 一开始有100个人,每个人都有100元
- 在每一轮都做如下的事情:
- 每个人可以拿1元给出自己外随机的另一个人
- 如果他是0元,可以不给
- 如果很多论之后,大家的财富平均吗?
如何定义平均? —— 基尼系数
- 差值总和(每个人和其他人的差值,然后所有人的差值加起来) / ( 2 * 人数n * 财富总和 )
- 当基尼系数达到 0.5 时,认为社会贫富差距非常大,分布非常不均匀
实验过程
- 先默认每个人没钱,然后走一个循环判断有没有钱,然后转换
(int) (Math.random()*n);
0到 n-1 的随机一个
学习算法入门提醒
- 善于,乐于折腾。勤写代码找到乐趣,只看课没有用。看懂了一定要确保自己手写正确,再继续下个内容。
- 算法的学习节奏,不像大学,像高中。区别是一个为了应试,一个在磨练手艺,代码人就是手艺人。
- 关于复习,尽量冲击到一定的题量再整体复习,不要频繁复习,会拉长周期,而且很多是无效的复习。
- 到了多少题600 700 的时候再去复习
算法讲解003【入门】二进制和位运算
大纲
二进制和位运算
前置知识: 无
建议: 不要跳过
- 二进制和位的概念
- 正数怎么用二进制表达
- 负数怎么用二进制表达
- 打印二进制:直接定义二进制、十六进制的变量
- 常见的位运算(!&, ^, ~, <<, >>, >>>)
- 解释打印二进制的函数
- 逻辑 |、&是位运算或,位运算与;||、&&是逻辑或、逻辑与,两者是有区别的
- 相反数
- 整数最小值的特殊性(取绝对值还是自己)
- 为什么这么设计二进制(为了加法的实现是一样,没有条件转移),那么为啥加法逻辑如此重要呢?
- 关于进位(自己确保自己的调用所得到的结果不会溢出,一定是自己确保的,计算机会给你做检查)
- 位运算玩出很多很多,特别是异或运算(后面的课会详细讲述),如何用位运算实现加减乘除(后面的课会详细讲述)
具体
- 二进制和位的概念
- 二进制 Binary
- 直接形式:如 0b10010 前面加上 0b 表示二进制形式 后面的10010表示数值 转换成10进制就是18
- 当某个位置的数字满2进1 —— 左边一位+1(逢二进一)
- 每一位对应 进制 n 的 x 次方,x为从右开始数的第几位但要 -1 ,因为最右边其实是 n的0次方 (几位数,你可以简单的认为你看到几个数字就是几位数)
- 所以默认最右边为 n 的 0 次方,即为1,如果这位是0,则表示0,如果为1 即为1,再往左就是 n 的 1 2 3 .... x 次方
- 无符号数: 每一位数字都拿来作 数值 位,并且没有负数
- 有 x 位数,则可以表示 2 的 x 次方 个数字,从 0 — 2的x次方-1共有 2^x -1 个数字
- 正数怎么用二进制表达
- 最高位为符号位,0为 正数, 1为负数
- 最左边以外的数字作为数值
- 负数怎么用二进制表达
- 两种方法
- 第一种直接写
- 先写出无符号整数的数值
- 最左边加上一个符号位 1
- 接着右边位当作数值
- 这样最终加上符号位的就是 负数了
- 第二种 知道负数,怎么拿到它的二进制表达(它的状态)呢? (左神 )
- 先写出它的正数
- 接着 -1
- 按位取反 (0变1 1变 0 )
- 这个是二进制表达 (也就是这个数的状态)
- 拿到负数的二进制状态(形式)(不是直接的二进制表示,这个是计算机看的,要转换成) 怎么看是 负几呢?
- 先看最高位正负,这个就是符号了
- 接着全部按位取反
- 再 +1 得到的数字(包括最左边的符号位,其实就是当作无符号位) 作为 数值
- 最后别忘了符号位的 -1
- 负数和非负数(0到 2的x次方 -1 )个数 相同
- 打印二进制:直接定义二进制、十六进制的变量
- 16进制 0x 开头
- 二进制中的每4位合为十六进制的1位
- 大于9的数字从 a -> 10 b -> 11 c -> 12 d -> 13 e -> 14 f -> 15 开始 分别对应表示 16就得进1了
- 常见的位运算(!&, ^, ~, <<, >>, >>>)
或运算 |
只要某一位有 1 则有 1 有1则1与运算 &
两位都得为 1 才为 1 11为1异或 ^
两位不同 才为 1 相反为1<< 左移
整体数字往左移 n 位 空出来的位置拿0补补>> 右移
往右移,左边拿符号位补>>>
往右移,左边一律拿 0 补- 非负数
<< i
等同于乘以2的 i 次方 - 非负数
>> i
等同于 除以2的 i 次方
- 解释打印二进制的函数
- 想要看一个数字二进制表达的第 i 位是 0 还是 1呢?
- 让这个数字
a & (1 << i)
,a为这个数字,i为第几位数字, - 假设 有个数
num
,打印它, 就让它的每一位(从最高位开始)& (1<<i)
,第几位数字,i 就是多少,(有多少位,i 的初始值就是多少),然后判断等于0吗?(每输出完一位,i 就得 -- ) - 如果是 0 该位置就是 0
- 但是不能拿来和 1 比 ,因为 & 出来的结果只有 0 和 非0 ,而不是只有 0 和 1,不要搞错了
- 要注意 1 的 & ,如果num是 long类型,那么 得
num & (1L << 48)
,不能越位,否则溢出
- 注意 | 、& 是 位运算或,位运算与;||、&&是逻辑或、逻辑与,两者是有区别的
- 位运算 一定是 每个数字 都会执行的 确定它们每个的状态才执行
- 而逻辑运算 则不一定,有穿透性(如果一个数
||
bool t=A || B || C || D
当遇到True
就会停止,只要是False
就会一直穿透下去&&
bool t =A && B && C && D
当遇到False
就会停止,只要是True
就会一直穿透下去
- 相反数
- 任何数字
取反 ~ + 1
即得到 这个数了 - 0的相反数是它本身
- 但是取反是 取反不了 有符号的最小负数的
- 整数最小值的特殊性(取绝对值还是自己)
- int long 的最小值取相反数,绝对值 还是自己
- 比如 4位的 -8, 32位,64位也一样的
- 为什么这么设计二进制(为了加法的实现逻辑是一样的,没有条件转移),那么为啥加法逻辑如此重要呢?
- 拿到负数做加法,先把负数通过它的正数转化出来
- 然后做加法,如果有溢出位,溢出位不要了
- 得到的结果就是正确的二进制表示的数
- 关于进位(自己确保自己的调用所得到的结果不会溢出,一定是自己确保的,计算机会给你做检查)
- 位运算玩出很多很多,特别是异或运算(后面的课会详细讲述),如何用位运算实现加减乘除(后面的课会详细讲述)
- 作者:瑾墨
- 链接:https://www.gaoqilan.tech/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/1031a31f-082e-8045-a517-eecdee9ffc59
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。