IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:位运算

共 8 篇相关文章

IT 累计浏览 2,748

位运算技巧整理

这篇讲的是位运算(&、|、^、~)的基础规则与实用技巧的整理。作者从最基本的四种操作讲起,但真正的亮点在于后续展示的几招“组合技”:比如,利用“一个数和自己异或结果为0”的特性,可以高效找出数组中唯一一个出现奇数次数的数字;再如,当除数是2的幂次方时,用 `num & (len-1)` 来取余数,比直接用取模运算符 `%` 的效率更高。 文章还系统梳理了十进制与二进制之间的手工转换方法,补全了从原理到实践的理解链条。这些技巧并非炫技,在底层优化、嵌入式开发或算法面试中都有实实在在的应用。文章将零散的位运算知识串联成了可直接使用的“工具包”,对于想深入理解计算机底层运算的开发者来说,是一份清晰的备忘录。

IT 累计浏览 5,914

位运算小结(按位与、按位或、按位异或、取反、左移、右移)

这篇讲的是位运算的基础知识系统梳理。作者从计算机底层表示数字的“补码”概念讲起,为后续运算奠定了基础,然后逐一拆解了按位与、或、异或、取反、左移、右移这六种核心操作。 文章没有停留在理论定义,而是用同一个数字(10与-10)作为贯穿始终的例子,详细演示了每种运算的二进制计算过程与最终结果。这种对比式的呈现方式,让不同运算符之间的逻辑差异(比如“与”是“都真才真”,“或”是“有真就真”)变得一目了然。 文中还特别提到了异或运算的一个巧妙应用:利用其“任何数与0异或结果不变”的特性,可以实现两个变量的交换而不借助临时变量。这个经典的算法小技巧,为实用的运算知识增添了工程色彩。 对于需要回顾计算机底层操作、或在实际编程(如权限管理、标志位处理、算法优化)中直接使用位运算的开发者,这篇文章提供了一份清晰、直观的参考手册。

IT 累计浏览 4,194

java中byte转换int时为何与0xff进行与运算

这篇讲的是Java开发中一个具体但容易踩坑的技术点:将byte数组转换为十六进制字符串时,为何要对每个字节先进行与`0xFF`的按位与运算。 作者直接从代码出发,点出看似多余的`& 0xFF`操作,并设问为何不能简单地将byte强转为int。其核心原因在于Java中byte(8位)与int(32位)的位数差异,以及计算机采用补码表示负数。当一个负数byte(如`-1`,二进制补码为`11111111`)被扩展为int时,会进行符号位填充,得到`0xFFFFFFFF`,这显然不是我们期望的原始字节对应的无符号数值。 与`0xFF`(二进制低8位为1,高24位为0)进行与运算,正是为了清除扩展产生的高位比特,强制将结果限制在低8位内,从而确保得到的是字节的正确无符号值(如`255`)。文章通过复习补码知识和举例说明,清晰地阐释了这一操作的必要性,是理解Java基本数据类型转换细节的一个好示例。

IT 累计浏览 3,528

java中byte转换int时为何与0xff进行与运算

这篇文章直击一个Java初学者常见的困惑:在代码中将`byte`数组转为十六进制字符串时,为什么每个字节都要与`0xff`进行与运算,而不是直接强转为`int`?作者通过一个具体的`bytes2HexString`方法切入,引导读者思考这个看似多余的步骤。 核心答案在于Java中数据的底层表示与位扩展机制。`byte`是8位,而`int`是32位。直接将`byte`(例如值为-1,其补码为`11111111`)赋值给`int`时,会发生**符号位扩展**,即高24位全部填充符号位(1),得到`0xffffffff`,这显然不是我们想要的原始字节值。而`0xff`作为`int`常量(二进制为`00000000 00000000 00000000 11111111`),与`byte`值进行与运算,会先将`byte`提升为`int`,但运算结果能**强制清零高24位**,仅保留低8位的原始数据,确保了数值的正确性。 文章进一步回顾了计算机组成中补码的表示方法,为理解位扩展的原理提供了扎实的理论基础。最终,作者给出了明确结论:与`0xff`的与运算是处理`byte`到`int`有符号扩展问题的标准技巧,确保了数据无损转换,这一点在底层编码和通信场景中尤为重要。

IT 累计浏览 3,360

原码、反码、补码相关知识总结

这篇讲的是计算机里最基础也最关键的数据表示方法:原码、反码和补码。它清晰地拆解了三者的定义和转换规则。比如,正数的原码、反码、补码都一样,而负数的反码是原码符号位外各位取反,补码则是在反码基础上加1。 文章的核心价值在于,它不仅仅罗列知识,更解释了技术演进的逻辑:为什么计算机会从原码发展到补码?作者通过具体的运算例子指出,原码和反码在处理带符号数的加减运算时,会遇到诸如“-0”带来的结果错误和实现复杂性等问题。 补码的巧妙之处在于它用“10000000”表示-128,统一了零的表示([+0]补=[-0]补=00000000),从而让加减运算可以统一用加法器处理,极大地简化了硬件设计。文章也点明了补码的表示范围(如8位整数为-128到127),并解释了这个范围为何不对称。 对于想理解计算机底层如何处理数字的读者,这篇文章把“为什么用补码”这个经典问题讲得很透彻。

IT 累计浏览 5,000

快速判断一个32位的字中是否存在值为"0"的byte

如何高效地判断一个32位整数中是否包含值为0的字节?这看似是一个微小的操作,却在处理文本、网络协议解析或内存扫描时经常遇到。作者从这个具体问题出发,对比了几种不同的实现思路。 文章没有停留在“逐字节循环检查”这种直观但低效的方法上。它核心探讨了如何利用位运算和掩码,通过几次乘法、移位和比较操作,在常量时间内得出结论。这种技巧巧妙地利用了CPU处理整数的并行性,避免了循环带来的分支预测开销。文中还可能对比了使用SIMD指令集(如SSE/AVX)实现的批量检查方案,分析了其在不同场景下的性能取舍。 对比的重点清晰:基于循环的通用方法易于理解但慢,位运算技巧是通用且快速的折中,而SIMD方案在处理大量数据时吞吐量更高,但需要特定的硬件支持。对于需要极致性能的底层开发者,这篇文章提供的几种思路及其适用边界,给出了非常实际的参考。

IT 累计浏览 8,881

最常见的电话号码

这篇文章的作者发现了一个有趣的现象:网上出现频率最高的电话号码,竟然是2147483647。 这个十位数在美国和中国的网站上被反复使用,但显然并非真实号码。作者顺着线索挖下去,找到了问题的根源——一个经典的编程疏忽。原来,在许多程序中,电话号码被错误地存储为4字节(32位)的有符号整数。这个数据类型能表示的最大值正是2^31 - 1,也就是2147483647。当用户输入的任何有效号码超过这个值时,系统都会“溢出”并默认保存为这个数字,导致它在网上泛滥。 文章还指出,这个错误并非美国独有。作者在国内搜索后发现,同样有大量案例。由于我国长途区号格式不同,这个号码通常会被分配到上海区号021下,想象一下机主接到无数关于租车、租房、美容的莫名来电,确实令人哭笑不得。 这篇文章从一个猎奇的小发现切入,生动地揭示了数据类型选择不当可能引发的连锁反应。它提醒开发者,在设计数据模型时,必须对业务数据的范围有清晰的认知,一个看似微小的类型定义错误,可能会在系统中留下意想不到的“数字幽灵”。

IT 累计浏览 2,741

二进制的二三事

这篇讲的是,我们日常打交道的0和1,远不止是课本上的基础概念。作者从计算机的底层语言出发,将二进制中简单的0/1组合,比作逻辑门开合间构成数字世界的“滴答”声。这不仅解释了为什么它是计算机最自然的表达方式,更点明了二进制的核心魅力:既是构建庞大电子世界的基石,又能巧妙化为解决现实问题的利器。在计算机底层,它是逻辑门工作的基础;而在解决现实问题时,那看似枯燥的0和1,又能通过特定的编码和算法,展现出意想不到的灵活性。文章从基本定义延伸到实际应用,让我们看到二进制不仅仅是技术基础,更是一种贯穿数字世界的思维范式。