分类 学习 下的文章 - 浮川的小窝
首页
休闲直播
4K壁纸
统计
关于
留言
归档
搜 索
1
HelloWorld!
122 阅读
2
前端算法整理
95 阅读
3
HTTPS原理和通信流程
77 阅读
4
百度长文语音生成
63 阅读
5
正则基础复习
37 阅读
生活
学习
随笔
吐槽
小秘密
小故事
登录
/
注册
搜 索
浮川
累计撰写
62
篇文章
累计收到
5
条评论
首页
栏目
生活
学习
随笔
吐槽
小秘密
小故事
页面
休闲直播
4K壁纸
统计
关于
留言
归档
用户登录
登录
注册
找到
39
篇与
学习
相关的结果
2023-09-21
javascript位运算&、|、~、^、>>的应用及原码、反码、补码的理解
| 位或运算符: 这个运算符用于对两个二进制数字的对应位执行或操作,只要两个数字的对应位中至少有一个是 1,结果位就是 1。const a = 5; // 二进制: 101 const b = 3; // 二进制: 011 const result = a | b; // 位或操作 console.log(result); // 输出: 7 (二进制: 111) 按位或 | ,对二进制的每一个比特位进行或操作如果是0和1会返回1,0和0会返回0 举个例子 当我们计算 2 | 4 的时候。里面的原理是先将2转为二进制之后把4也转为二进制进行比较我们可以通过toString进行转换 2 === 0010 4 === 0100 结果是:0110 将结果转为10进制返回的是6 那么也就是说 2 | 4 会返回6 应用场景 当我们进行取整的时候可以使用 比如 1.2 | 0 返回1 ,2.2 | 0会返回2& 位与运算符: 这个运算符用于对两个二进制数字的对应位执行与操作,只有在两个数字的对应位都是 1 时,结果位才是 1,否则为 0。const a = 5; // 二进制: 101 const b = 3; // 二进制: 011 const result = a & b; // 位与操作 console.log(result); // 输出: 1 (二进制: 001) 按位与 & ,对二进制的每一个比特位进行与操作如果是0和1会返回0,0和0会返回0,只有是1和1的时候才会返回1 举个例子 比如一个系统的权限 是 1 2 4 8 分别对应的 0001 0010 0100 1000 那么 A用户权限是 1|2|4|8 = 15 ,B用户权限是4|8=12 那么条件就可以这样: 15 & 1 === 1 15 & 2 === 2 15 & 4 === 4 15 & 8 === 8 12 & 4 === 4 12 & 8 === 8 应用场景 我们可以使用按位与来判断一个数的奇偶数,因为二进制最后一位如果为1那么一定是个奇数,所以我们可以这样 奇数 & 1 返回1 ,Number & 1 === 1^ 位异或运算符: 这个运算符用于对两个二进制数字的对应位执行异或操作,只有在两个数字的对应位不相同时,结果位才是 1,否则为 0。const a = 5; // 二进制: 101 const b = 3; // 二进制: 011 const result = a ^ b; // 位异或操作 console.log(result); // 输出: 6 (二进制: 110) 按位异或 ^ ,对二进制的每一个比特位进行异或操作如果是0和1会返回1,0和0会返回0,1和1返回0 应用场景 1.可以通过一些条件来切换一个值为0或1 比如 1 ^ 1 = 0 ,0 ^ 1 = 1 2.交换两个变量的值 es6可以有结构赋值的方式[a,b] = [b,a] ,使用位运算可以不用第三个变量 let a = 1,b = 2; a = a ^ b b = a ^ b a = a ^ b 3.还可以做一些简单的字符串加密算法这里就不演示了~ 位非运算符: 这个运算符用于对一个二进制数字的每一位执行非操作,将 0 变为 1,将 1 变为 0。const a = 5; // 二进制: 101 const result = ~a; // 位非操作 console.log(result); // 输出: -6 (二进制: 11111111111111111111111111111010,注意这是有符号整数表示) 按位非 ~ ,对二进制的每一个比特位执行非操作如果是0变成1,1变成0 有几个点需要知道一下: 源码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理 1.对数值进行按位非操作的结果为-(x+1)比如~1返回-2,计算公式 ~(x) = -(x+1) 2.我们读取的十进制是根据源码进行读取的,在内存中,数值都是二进制补码的方式保存的举个例子 十进制2的二进制结构 :0000,0010 进行按位非取反结果为1111,1101,正数的补码和源码一样,负数源码转补码或者补码转源码则有其他规则 1.符号位不变,将剩余位取反,得到反码,在反码的基础上最后一位加一得到负数的补码 1111,1101转10进制: 1.符号位不变,剩余位取反结果为1000,0010 2.最后一位加1,结果为 1000,0011 3.得到的结果1000,0011就是-3的源码 ~(1) = -2 ~(2) = -3>> 右移运算符 << 左移运算符: 这个运算符将一个二进制数字向右移动指定的位数,丢弃最右边的位,同时在最左边添加相同数量的符号位(正数为 0,负数为 1),以保持符号不变。const a = 16; // 二进制: 10000 const result = a >> 2; // 右移 2 位 console.log(result); // 输出: 4 (二进制: 0010)按位移动左移 << ,该操作符会将第一个操作数向左移动指定的位数。向左被移出的位被丢弃,右侧用 0 补充 按位移动右移 >> ,该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,拷贝最左侧的位以填充左侧 应用场景 可以在rgb颜色和16进制颜色之间转换原码是最简单的机器数表示法,用最高位表示符号位,其他位存放该数的二进制的绝对值 以带符号位的四位二进制数为例:1010,最高位为1表示这是一个负数,其它三位010,即02^2+12^1+0*2^0=2,所以1010表示十进制数-2。原码的表示法很简单,虽然出现了+0和-0,但是直观易懂。于是开始运算—— 0001+0010=0011,1+2=3; 0000+1000=1000,+0+(-0)=-0; 0001+1001=1010,1+(-1)=-2。 于是可以看到其实正数之间的加法通常是不会出错的,因为它就是一个很简单的二进制加法,而正数与负数相加,或负数与负数相加,就要引起莫名其妙的结果,这都是符号位引起的。0分为+0和-0也是因它而起。原码的特点:原码表示直观、易懂,与真值转换容易。原码中0有两种不同的表示形式,给使用带来了不便。通常0的原码用+0表示,若在计算过程中出现了-0,则需要用硬件将-0变成+0。原码表示加减运算复杂。利用原码进行两数相加运算时,首先要判别两数符号,若同号则做加法,若异号则做减法。在利用原码进行两数相减运算时,不仅要判别两数符号,使得同号相减,异号相加;还要判别两数绝对值的大小,用绝对值大的数减去绝对值小的数,取绝对值大的数的符号为结果的符号。可见,原码表示不便于实现加减运算。反码正数的反码还是等于原码;负数的反码就是它的原码除符号位外,按位取反。 原码最大的问题就在于一个数加上它的相反数不等于0,于是反码的设计思想就是冲着解决这一点,既然一个负数是一个正数的相反数,那干脆用一个正数按位取反来表示负数。以带符号位的四位二进制数为例:3是正数,反码与原码相同,则可以表示为0011;-3的原码是1011,符号位保持不变,低三位按位取反,所以-3的反码为1100。再试着用反码的方式解决一下原码的问题—— 0001+1110=1111,1+(-1)=-0; 1110+1100=1010,(-1)+(-3)=-5。 互为相反数相加等于0,虽然的到的结果是1111也就是-0。但是两个负数相加的出错了。反码的特点:在反码表示中,用符号位表示数值的正负,形式与原码表示相同,即0为正;1为负。在反码表示中,数值0有两种表示方法。反码的表示范围与原码的表示范围相同。反码表示在计算机中往往作为数码变换的中间环节。补码正数的补码等于它的原码;负数的补码等于反码+1(这只是一种算补码的方式,多数书对于补码就是这句话)。其实负数的补码等于反码+1只是补码的求法,而不是补码的定义,很多人以为求补码就要先求反码,其实并不是,那些计算机学家并不会心血来潮的把反码+1就定义为补码,只不过补码正好就等于反码+1而已。如果有兴趣了解补码的严格说法,建议可以看一下《计算机组成原理》,它会用“模”和“同余”的概念,严谨地解释补码。补码的思想补码的思想,第一次见可能会觉得很绕,但是如果肯停下来仔细想想,绝对会觉得非常美妙。补码的思想其实就是来自于生活,只是我们没注意到而已,如时钟、经纬度、《易经》里的八卦等。 补码的思想其实就类似于生活中的时钟。如果说现在时针现在停在10点钟,那么什么时候会停在八点钟呢? 简单,过去隔两个小时的时候是八点钟,未来过十个小时的时候也是八点钟。 也就是说时间倒拨2小时,或正拨10小时都是八点钟。 也就是10-2=8,而且10+10=8。 这个时候满12,说明时针在走第二圈,又走了8小时,所以时针正好又停在八点钟。 所以12在时钟运算中,称之为模,超过了12就会重新从1开始算了。 也就是说,10-2和10+10从另一个角度来看是等效的,它都使时针指向了八点钟。 既然是等效的,那么在时钟运算中,减去一个数,其实就相当于加上另外一个数(这个数与减数相加正好等于12,也称为同余数),这就是补码所谓运算思想的生活例子。 在这里,再次强调原码、反码、补码的引入是为了解决做减法的问题。在原码、反码表示法中,我们把减法化为加法的思维是减去一个数等于加上这个数的相反数,结果发现引入符号位,却因为符号位造成了各种意想不到的问题。 但是从上面的例子中,可以看到其实减去一个数,对于数值有限制、有溢出的运算(模运算)来说,其实也相当于加上这个数的同余数。也就是说,不引入负数的概念,就可以把减法当成加法来算。 补码的实例接下来就做一做四位二进制数的减法(先不引入符号位)。0110-0010,6-2=4,但是由于计算机中没有减法器,没法算。这时候,想想时钟运算中,减去一个数,是可以等同于加上另外一个正数(同余数),这个数与减数相加正好等于模。也就是四位二进制数最大容量是多少?其实就是2^4=16(10000)。那么-2的同余数,就等于10000-0010=1110,16-2=14。既然如此,0110-0010=0110+1110=10100,6-2=6+14=20。按照这种算法得出的结果是10100,但是对于四位二进制数最大只能存放4位,如果低四位正好是0100,正好是想要的结果,至于最高位的1,计算机会把它放入psw寄存器进位位中,8位机会放在cy中,x86会放在cf中,这里不做讨论。这个时候,再想想在四位二进制数中,减去2就相当于加上它的同余数(至于它们为什么同余,还是建议看《计算机组成原理》)。但是减去2,从另一个角度来说,也是加上-2,即加上-2和加上14得到的二进制结果除了进位位,结果是一样的。如果我们把1110的最高位看作符号位后就是-2的补码,这可能也是为什么负数的符号位是1,而不是0。到这里,原码、反码的问题,补码基本解决了。在补码中也不存在-0了,因为1000表示-8。补码的特点:在补码表示中,用符号位表示数值的正负,形式与原码的表示相同,即0为正,1为负。但补码的符号可以看做是数值的一部分参加运算。 正数的补码表示就是其本身,负数的补码表示的实质是把负数映像到正值区域,因此加上一个负数或减去一个正数可以用加上另一个数(负数或减数对应的补码)来代替。从补码表示的符号看,补码中符号位的值代表了数的正确符号,0表示正数,1表示负数;而从映像值来看,符号位的值是映像值的一个数位,因此在补码运算中,符号位可以与数值位一起参加运算。 在补码表示中,数值0只有一种表示方法。负数补码的表示范围比负数原码的表示范围略宽。纯小数的补码可以表示到-1,纯整数的补码可以表示到-2^n。由于补码表示中的符号位可以与数值位一起参加运算,并且可以将减法转换为加法进行运算,简化了运算过程, 因此计算机中均采用补码进行加减运算。为什么负数的补码的求法是反码+1拿-2举例:【正整数2的原码】 (0010) 【正整数2的反码】(1101) 【-2的原码】 (1010) 【-2的反码】 (1101) 【-2的补码】 (1110) 【-2的绝对值】=【正整数2的原码】 (0010)因为负数的反码(1101)加上这个负数的绝对值(0010)正好等于1111(1101+0010=1111),在加1,就是10000,也就是四位二进数的模,而负数的补码(1110)是它的绝对值(0010)的同余数(10000-0010=1110),可以通过模减去负数的绝对值(10000-0010=1110)得到它的补码(1110),所以负数的补码就是它的反码+1(1101+1=1110)。 【-2的补码】 + 【-2的绝对值】 = 【-2的反码】 + 【-2的绝对值】 + 1 = 模(10000) -> 【-2的补码】 = 【-2的反码】 + 1文章来源,感谢原作者的无私分享:https://zhuanlan.zhihu.com/p/99082236https://juejin.cn/post/6967233795623747614https://www.php.cn/faq/489781.html
2023年09月21日
15 阅读
0 评论
0 点赞
2023-09-19
nas定时任务监测端口状态
家里有个黑群不稳定 总是跑着跑着就挂了 日志暂时性没有定位到问题 :@(小怒) 所以现阶段只能用最low的方式解决问题 直接重启虚拟机 :@(无语) :@(无语) :@(无语) 所以改改抄抄写了个测试连通性的脚本 每30分钟执行一次 正好用白群定时任务 内网调用黑群ip地址 没有响应调用server酱推送消息 完美!! :@(赞一个) :@(赞一个) :@(赞一个)# #! /bin/bash ip="XXX.XXX.XXX.XXX" port=XXXX SENDKEY="XXXXXXX" # SERVER酱密钥 # # 发送消息 function sc_send() { local text=$1 local desp=$2 local key=$3 postdata="text=$text&desp=$desp" opts=( "--header" "Content-type: application/x-www-form-urlencoded" "--data" "$postdata" ) result=$(curl -X POST -s -o /dev/null -w "%" "https://sctapi.ftqq.com/$key.send" "$") echo "$result" } # # 记录调用日志 function log() { # sh脚本同级目录 local log_path="$(cd $(dirname $0);pwd)/sc_send.log" local now=$(date "+%Y-%m-%d %H:%M:%s") echo $(cd $(dirname $0);pwd) echo "$now $1" >> "$log_path" } # 主函数 function main() { arrFlag=(0 0 0) flag=false for i in do responseText=$(curl -I $ip:$port) echo $responseText sleep 2 if [[ $responseText =~ "Failed" ]]; then arrFlag[$i-1]=1 fi done for i in $; do if [ $i -eq 1 ]; then flag=true break fi done if [ $flag = true ]; then msg="$ip:$port -异常" ret=$(sc_send '主人DS918服务器宕机了' "$msg" "$SENDKEY") log "$msg" else log "$ip:$port -正常" fi } main没有通过的话会调用server消息推送 算是能第一时间知道黑群挂了 好重启
2023年09月19日
11 阅读
0 评论
0 点赞
2023-09-05
魔改easy-mock
由于工作中发现上古数据模拟easy-mock项目只能支持简单的数据展示,并不能实现真正意义上的动态插入数据,并获取插入的数据为基础进行修改,只能在函数模板中进行死数据的展示(用过的朋友都知道 我就不试图把这种情况用语言叙述出来了 :@(小怒) ) 于是乎我感觉现在的功能不太适合轻量的展示我的数据(有些简单的页面还是需要真实数据的添加并删除修改的) 所以我就在老前辈的老古董项目里面一通乱改 :@(脸红) :@(脸红) :@(脸红) 实现了一个简单的联动效果 不叭叭上图!!就拿新增接口举例 我看了下easy-mock的源码 一开始想的可简单了想法1:直接在mock.js 文件中添加一个全局变量不就得了 但是这种方式不大行 因为每个接口都是一个独立的module 我设想的"全局变量"并不能数据互通想法2:直接把属性绑定在Mock变量上不就得了(该想法情况同上)最终拗不过 还是要使用mogoose数据库 一开始打算不想改动很大的 但是最终绕不过数据持久化的问题 改完的项目我放到了这里,有兴趣的可以去看看(写的比较乱 就为了实现功能)传送门:隐藏内容,请前往内页查看详情最终实现的方式如上图 在里面添加了回调方法 如果需要插入则解构出mockInsertCallBack方法并调用 传入的参数为:/* * @params field string 字段(定义全局数据的名字 该属性回档定在ctx上下文中 并通过调用接口时调用数据库获取数据) * @params mockData Array[] 数据(需要保存的数据 为数组) */更新为mockUpdateCallBack 传参同理查询接口如图所示 传参数field mock函数中查找上下文options对象中的XXX__Data属性就可以找到数据------------end------------
2023年09月05日
9 阅读
0 评论
0 点赞
2023-08-17
自封装小组件评分
因为要在触摸板上加一个评分页面 又不想把整个ui库都引进来 所以直接手写了一个简单的评星组件 还是vue 有全星半星模式 用的svg中的mask实现的模板遮盖 感觉还凑付能用吧
2023年08月17日
10 阅读
0 评论
1 点赞
2023-08-11
goLang数组初识
最近正在看golang基础 :@(小怒) :@(小怒):@(小怒)(又开新坑了这是= =) 看到数组部分 写demo测试的时候发现有个小不同package main import ( "errors" "fmt" "strconv" ) func main(){ // 指定数组长度 // 传入函数形参时会拷贝一份新的数组值 修改的是函数内部的拷贝副本 arr := [3]int updateArr(arr) // [1,2,3] // 不定数组长度 // 此处为一个切片为一个引用类型 传递的事指针地址遂等同于下方操作 arr := []int updateArrTwo(arr) // 指定数组长度并传入地址值 // 传入地址值好理解 直接修改了原数组数据 arr := []int updateArrThree(&arr) fmt.Println(arr) // [1,7,3] } func updateArr(arr [3]int){ arr[1] = 7 } func updateArrTwo(arr []int){ arr[1] = 7 } func updateArrThree(arr *[]int){ (*arr)[1] = 7 }然后就舔着个脸去问GPT :@(脸红):@(脸红)发现了切片这个概念 于是去官网去找 结合csdn一位博主所说:————————————————切片(slice)是golang中一种特有的数据类型数组有特定的用处,但是却有一些呆板(数组长度固定不可变),所以在 Go 语言的代码里并不是特别常见。相对的切片却是随处可见的,切片是一种建立在数组类型之上的抽象,它构建在数组之上并且提供更强大的能力和便捷。切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。————————————————package main import ( "fmt" ) func main(){ //定义数组: intarr := [6]int //切片构建在数组之上 slice := intarr[1 : 3] //输出数组 fmt.Println("intarr:", intarr) // [3 6 9 1 4 7] //输出切片 fmt.Println("slice:", slice) // [6 9] 包头不包尾 //输出切片个数 fmt.Println("slice的元素个数", len(slice)) // 2 // 修改切片数据 slice[1] = 55 //输出修改后切片 fmt.Println("slice2:", slice) // [6 55] //输出修改后数组 fmt.Println("intarr2:", intarr) // [3 6 55 1 4 7] 原数组数据也更改了 }如果使用make创建一个空切片并将原值copy到空切片上 这两个变量的字面量是相同的package main import ( "fmt" ) func main(){ // 切片的定义 intarr2 := []int slice2 := intarr2[0:6] // 此处的切片slice2和intarr2共享同一个底层数组 但是两人堆中的地址值不相同 // 并不能简单的理解成地址值相同那这两个变量就是一个完全相同的引用类型变量 } 这句感觉很关键刚在学习阶段 理解的不是很透彻 记录一下 待以后学成而归再修正 :@(装大款) :@(装大款)
2023年08月11日
6 阅读
0 评论
0 点赞
1
2
3
...
8