二进制与位运算学习笔记

参考资料:
二进制与位运算https://www.luogu.com.cn/blog/chengni5673/er-jin-zhi-yu-wei-yun-suan

二进制内容:

关于负数在计算机内用补码(取反再加1)表示:

首先说明下,模m意义下,加a等价于减(m-a)。32位数实际上是有模2^32 的意义(如何判断意义下的模数:看意义下数的范围,从0开始,32位1(即2^32 -1)结束,则模数为最大值加1 =2^32)。一个数的原码加反码的结果为32位1,故要达到模数,还得加1(这就是补码)。

符号位、运算相关:

“真值(个人称呼,把符号位也看做数值时的值)”大于等于2^31 的,即符号位为1,视为负数。负数-a是用m-a表示的,真值越小,与m的差距越大,即a(或者说绝对值)越大,符合直觉。此时加减法可全由补码的加法实现。一个数b减一个数a(不妨设a>0),可视为加上-a的补码,也可视为减a的补码,不过都是在b的补码的基础上运算。

位运算:

~不同于变号。
^:取反,相同部分赋零。
&:部分赋零
|:值合并。
&某种意义上也可说是对于零的或运算。
注意是否要后导零。考虑不变部分的位置。
x+1:末尾连续1进1变0 。x-1:末尾连续0退1变1

与或运算转换为异或:1式只留下了两数中只有一个1的位;2式同理,把<<1看做“2个”就是。

运算优先级:先计算,再操作,再位。

builtin函数:
https://blog.csdn.net/qq_21127151/article/details/106309611
https://blog.csdn.net/qq_42101694/article/details/120880841 (更扩展)

快速乘:

https://www.cnblogs.com/812-xiao-wen/p/10543023.html
对于第三种,long double失精大时会错误。
对于第四种,模数位数x大于31小于63的,以63-x 把第二个乘数分段,每段算完值和位数后加起来。
算位数时可能一段不够,要多段算,总之每次结果不超过63位,然后再一模到x位。
核心思想:取模的分配律,ll能算多少就分多大段。

posted @ 2022-04-25 13:46  千叶繁华  阅读(160)  评论(0编辑  收藏  举报