欢迎来到皮皮网网首页

【jquery源码导读】【校园appandroid源码】【表情源码包】位运算源码

来源:笔记网站源码之家下载 时间:2024-11-28 20:06:59

1.c语言中怎么把一个数各位取出来相加
2.BitMap原理与实现
3.重写 CryptoJS二、位运WordArray 与位操作

位运算源码

c语言中怎么把一个数各位取出来相加

       在C语言中,算源你可以使用位运算来实现将一个数的位运各位取出来相加的功能。

       以下是算源一个简单的例子:

       在这个程序中,sum_digits函数接收一个整数num作为参数,位运并返回num的算源jquery源码导读所有数字之和。该函数通过不断除以和取余操作,位运将num转换为每一位,算源然后累加每一位的位运值。最后,算源返回累加的位运结果。

       在主函数中,算源我们提示用户输入一个整数,位运并将其存储在num变量中。算源然后,位运我们调用sum_digits函数计算num的所有数字之和,并将结果输出到屏幕。 

       需要注意的是,这个程序只能处理非负整数。如果你需要处理负数,你需要先将其转换为非负整数。校园appandroid源码

       ♡♡ 有帮助到的话,麻烦采纳哦!♡♡

BitMap原理与实现

        比较经典的问题是: 在只能够使用2G的内存中,如何完成以下操作:

        ①:对亿个不重复的整数进行排序。

        ②:找出亿个数字中重复的数字。

        无论是排序还是找重复的数字都需要将这亿个数字加入到内存中在去进行操作,很明显,题目给出的2G内存限制说明了在这样的场景下是不能够将所有数都加入到内存中的

        * 4/(* * ) = 3.G

        那么这时候就需要用到 BitMap结构了

        bitMap使用一个bit为0/1作为map的value来标记一个数字是否存在,而map的key值正是这个数字本身。

        相比于一般的数据结构需要用4个byte去存储数值本身,相当于是节省了 4*8:1 = 倍的内存空间

        bitMap不一定要用bit数组,可以使用 int,long等等的基本数据类型实现,因为其实质都是在bit位上存数据,用哪种类型只是决定了最终实现出来的BitMap的内置数组中单个元素存放数据的多少

            例如:java中的BitSet使用Long数组

        BitMap的实现当然少不了位运算,先来明确几个常见位运算,这是实现BitMap的基础:

        set(bitIndex): 添加操作

            1 .确定该数处于数组中的哪个元素的位上

             int wordIndex = bitIndex >> 5;

        因为我用的是int[]实现,所以这里右移 5 位(2^5 = )

            2 .确定相对于该元素中的位置偏移

             int bitPosition = bitIndex & ((1 << 5) - 1);

        这里相当于是 bitIndex % (1<<5)的取模运算,因为当取模运算的除数是2的次幂,所以可以使用以下的位运算来计算,提升效率(对比HashMap的容量为什么总是2的幂次方的问题,HashMap求下标时也是使用 hash&(n-1))

        tips: 位运算的优先级是低于+,-等等的,所以要加上括号,防止发生不可描述的错误

            3 .将该位置1

             bits[wordIndex] |= 1 << bitPosition;

        相当于是将指定位置处的bit值置1,其他位置保持不变,也就是将以这个bitIndex为key的位置为1

        tips: 这里是参考了网上的各位大佬的文章,取余 + 按位或,又对比了下BitSet的源码:

             words[wordIndex] |= (1L << bitIndex);

        没有取余操作,直接|,这两个一样吗?答案当然是一样的

        举个栗子:

             1 << == 1<<     

             1L << ==1L<<

        即对于int和long型数据,直接左移其位数相当于是附带了对其的取模操作

        总结:使用Bit-map的思想,我们可以将存储空间进行压缩,而且可以对数字进行快速排序、去重和查询的操作。

        Bloom Fliter是Bit-map思想的一种扩展,它可以在允许低错误率的场景下,大大地进行空间压缩,是一种拿错误率换取空间的数据结构

        当一个元素加入布隆过滤器中的时候,会进行哪些操作:

        当我们需要判断一个元素是否存在于布隆过滤器的时候,会进行哪些操作:

        然后,一定会出现这样一种情况:不同的字符串可能哈希出来的位置相同(可以适当增加位数组大小或者调整我们的哈希函数来降低概率),因此:布隆过滤器可能会存在误判的情况

        总结来说就是: 布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在。

        Bloom Filter的应用: 常用于解决缓存穿透等场景。

重写 CryptoJS二、WordArray 与位操作

       源码地址: entronad/crypto-es 重写 CryptoJS一、ECMAScript 类与继承

       位操作是各种编码、散列、加密算法的基础。位操作对象本质上是一段连续的比特序列。在性能上,直接操作连续内存位是表情源码包最佳选择。C++中的数组与指针、ECMAScript 6中的ArrayBuffer提供了此功能。然而,JavaScript最初作为浏览器脚本语言设计,并未直接提供内存操作特性。但通过二进制位操作符,仍可实现对连续比特序列的位操作。

       标准规定,在位操作运算中,不论操作数为何种类型,python split 源码均通过ToInt()转换为位有符号整数,进行位运算。因此,通过拼接位有符号整数,可以实现对连续比特序列的位操作。CryptoJs正是基于此原理,实现了名为WordArray的类,作为连续比特序列的抽象,用于各种位操作。WordArray是shopify后台源码CryptoJs中最核心的类,所有主要算法的操作对象都是WordArray实例。理解WordArray是理解CryptoJs算法的基础。

       WordArray定义在core.js中。它直接继承自Base类,包含words和sigBytes两个成员变量。words为位有符号整数的数组,通过顺序拼接数组中的数形成比特序列。JavaScript中的位有符号整数通过补码转换为二进制,具体表示形式不重要,实际使用中比特序列多用字节或进制表示。位等价于4个字节,或8个进制数。

       编码算法的对象为字符,实际比特序列长度通常是整字节,即8的倍数,但不一定是的倍数。因此仅通过words数组不能反映实际长度,可能有多余位。sigBytes变量表示实际有效字节数。可直接传入这两个字段构建实例。

       为了方便sigBytes对words数组的控制,WordArray定义了一个名为clamp的方法。此方法用于压缩,移除非有效字节。保留全部有效字节,去除末段无有效字节的word。对于中间段非全有效字节的情况,首先计算去除位数,生成掩码,通过与sigBytes右移操作找到分界word下标,与掩码取与,将无效字节置零。

       concat方法用于拼接两个WordArray实例,主要麻烦在于处理分界word。在CryptoJS内部,WordArray是算法操作和结果的主要载体。然而,外部使用者通常期望获得特定编码方式的字符串结果。因此,WordArray提供了重写的toString方法。

       考虑到words数组为引用类型,clone方法需要重写,通过slice复制一份拷贝。此外,还提供静态函数生成指定字节长度的随机WordArray。由于Math.random()提供的非安全随机数且为位浮点数,生成过程中进行了适当处理。