0x01——位运算

本文介绍了二进制在编程中的基础知识,包括位运算的优先级、位与memset的使用、移位运算以及二进制状态压缩。讲解了如何利用位运算进行数组压缩存储,并举例说明了在解决实际问题如最短Hamilton路径和起床困难综合症中的应用。还探讨了位的其他特性,如成对变换和lowbit运算,这些在图论和数据结构中有着重要应用。

基础知识及二进制常见用法

  • 前言

bit是度量信息的单位,包含0和1两种状态。计算机的各种运算最后无不归结位一个个bit的变化。熟练掌握并利用位运算,能够帮助我们理解程序运行中的种种表现,提高程序循行的时空效率,降低编程复杂度。

  • 运算符优先级

从左到右优先级依次降低

加减 移位 比较大小 位与 异或 位或
+,- <<,>> <,>==,!= & xor(C++^) |
  • 位与memset

我们都知道,memset可以以字节为单位初始化变量或者数组,这里有几个特>别的数字:

  • 0x3F3F3F3F 1061109567
    -> 0x7F7F7F7F 2147483647
  • 0xFFFFFFFF -1

观察这几个数字,我们会发现0x3F3F3F3F是个很有用的数字,原因如下:

  • 可以直接用memset初始化
  • 0x3F3F3F3F的两倍不会超过int的最大范围
  • 这个数足够大

这也是常常使用INF = 0x3F3F3F3F的原因

memset(a,0x3f,sizeof a);
  • 移位运算
>> <<
即除以2向下取整 1 < < n = 2 n , n < < 1 = 2 ∗ n 1<<n = 2^{n} , n<<1 = 2 * n 1<<n=2n,n<<1=2n

例题:

  1. a^b
  2. 64位整数乘法
  • 二进制状态压缩

二 进 制 状 态 压 缩 , 是 指 将 一 个 长 度 为 m 的 b o o l 数 组 用 一 个 m 位 的 二 进 制 整 数 表 示 {\color{Red} 二进制状态压缩,是指将一个长度为m的bool数组用一个m位的二进制整数表示} mboolm
并 储 存 的 方 法 。 利 用 下 列 位 运 算 操 作 可 以 实 现 原 b o o l 数 组 中 对 应 下 标 的 存 取 。 {\color{Red} 并储存的方法。利用下列位运算操作可以实现原bool数组中对应下标的存取。}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值