自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 位运算chapter6:模拟模运算和底层规律--从三等式到四等价

根据周期性和四等价的底层关系,可以得出n&1+n&4==n&5,那么,k&5同样是具有周期为8的循环的,其中,k&4是以0,0,0,0,4,4,4,4为一个周期的,k&1是以0,1为一个周期的,在这两者叠加之下,模等于1和模等于3在&5下就被特化成了'1'。-1)这个恒等式,可以将n%8==1||n%8==3转变为n&7==1&&n&7==3,但是这样的描述好像有些累赘了,有没有更简便的写法呢?类似的,如果要构造出n%4==2||n%4==3这个条件,那么可以等价为n&2==1。,k为p的二进制位数。

2024-08-01 23:59:15 651

原创 位运算chapter5:提取一个数二进制表达式末位0的个数

是能被一个整数整除的数。例如,12的因数包括:1, 2, 3, 4, 6, 12,因为12能够被这些数整除而没有余数。是一个整数的所有因数中最大的奇数因数。奇数因数是指不能被2整除的因数。一个数的二进制表示末尾0的个数表示该数能够被2连续整除的次数。在函数的调用过程中,'&'引用符号不可以省略,否则k无法被写入。通过位运算,可以高效地计算一个整数末尾0的个数。输入一个正整数,求这个数的。先做个因数和最大基因数概念的简易阐述。当然,利用​​​​​​​​​​​​​​。时间复杂度也是O(1)。

2024-08-01 18:59:15 793

原创 位运算chapter4:掩码法---位分治原地逆置二进制表达式

这里没有掩码,因为我们直接做一次16位的大交换:将原数的前16位移动到后16位的位置,将后16位移动到前16位的位置。组合这些步骤,我们逐渐扩大了交换比特位的间隔距离,从最原始的相邻位一直到16位块,实现了一个完整的32位二进制数的位翻转。,我们将所有偶数位向左移动1位,填充到奇数位的位置。这一步中,我们交换每隔1位的比特位,也就是说,我们现在操作每一对位中的每4个位。在这里,我们转而交换每隔3位的比特位,即我们操作每8位内的比特位。,将每组4位内的后2位移动到原来前2位的位置,从而实现位的交换。

2024-02-25 16:43:31 466

原创 位运算chapter3:判断是否是2的幂的幂------构造掩码法

这个掩码的构造思路也十分简单,首先找到二的幂的这个数的二进制表达式,比如说32,是100000,然后-2,得到11110,最后把它反复拼接(从11110变成1111011110以此类推),并删去超过数据类型的部分。是2的幂,然后检查1是否在奇数位上,因为4的任何幂的二进制表示将只有一个1,并且1出现在偶数位置上。,用一个特定的掩码来检查1的位置是否符合2的幂的幂的规则。这个掩码里的‘1’是用来屏蔽非2的幂的幂的位置的。同理,16的幂验证,确保1出现在4的倍数的位置上。brian kernighan算法。

2024-02-25 14:55:32 787

原创 位运算chapter2+½:有效位同或(异或非)运算的实现

注意,这里并不能直接写成~(n^m)因为这样会改变符号位,并且把二进制位中的前置0都变成1。原理很简单,就是用n^m的结果再次异或所有位都是1的一个二进制数。虽然C++中没有直接提供"同或"运算符,而这里的前置0显然不是有效位。下面以Eqv(22, 27)

2024-02-24 23:39:03 266

原创 位运算chapter2:求[left,right]所有自然数的与运算

这样我们便得到了剩余的二进制位的 AND 结果,即公共前缀后跟上对应数量的0。并控制条件当left>=right时循环终止,可以实现求left和right的公共前缀所代表的数。通过brian kernighan算法来实现不断地把right的二进制表达式中的最右侧的1删去。之间的数都会影响最终的 AND 操作结果,所以当两者相等,我们确保了它们的公共前缀(即。然后对其取反,原本是1的位置全都变成了0,并且刚好对应left和right的所有非公共位。,记录left和right的非公共部分的位数。

2024-02-24 23:11:54 1036

原创 位运算chapter1+⅔:与运算‘&’提升---Brian Kernighan算法

n & (-n)这个操作用来获取一个数 (n) 在二进制表示下最低位的1,和它的位位置。在二进制系统中,负数通常以补码(two’s complement)的形式存储。对应的算式是-n=~n+1。因此,当你做 n & (-n)时,实际上你将 n 和 n 的补码进行位与操作。这个操作的效果是,所有 n 最低位1以上的位都会被设置为0,因为 n 和 -n 在这些位置上数值相反。

2024-02-23 18:49:45 682 1

原创 位运算chapter1+⅓:全1函数与其实例

而浮点运算更复杂,涉及到位表示的解析、指数和尾数的运算等,因此,尽管从时间复杂度上来说使用log2的实现略胜一筹,但实际情况下,这个实现的性能可能与单纯使用位运算的实现平分秋色。以此类推,每一次都会复制一次原先的1到后面的位上,而一个数的二进制位数一共是logn个。①n不是2的幂,n--不会改变这个数的二进制位数,所以经过全1化之后,n会变成。②n是2的幂,结果就是n本身,n--先降位,然后全一化n会变成。,然后再加1就得到大于等于n的最小的2的幂。因此,这个算法的时间复杂度是以2为底的。

2024-02-23 16:50:23 264 1

原创 位运算chapter1:无if,else,switch,?:实现求两数较大/小者

这里只详细解释这句话的用途:bitset returnB = diffAB & sa | sameAB & sc;因此,有了这句话 bitset returnB = diffAB & sa | sameAB & sc;但是不足的地方是这个算法无法处理unsigned类型的情况,也就是无符号类型的情况。当AB同号是,如果C是负数,那么等价A-B

2024-02-22 23:59:32 174 1

原创 位运算chapter0:简介二进制表达式与位运算

从0开始学位运算,感受底层的魅力

2024-02-22 23:14:11 647

原创 最大子列和问题高效算法

给定K个整数组成的序列{ N1​, N2​, ..., NK​ },“连续子列”被定义为{ Ni​, Ni+1​, ..., Nj​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。本题旨在测试各种不同的算法在各种数据情况下的表现。

2024-01-18 00:13:04 419 1

原创 C++动态规划和位运算实现整数分拆数

C++动态规划和位运算实现整数分拆数,数论,五边形数拆分定理,

2024-01-10 09:00:00 403 1

原创 C++质数的判定检验

素数(质数)的判断

2023-09-10 21:08:02 86 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除