鱼C论坛

 找回密码
 立即注册
查看: 2939|回复: 7

[技术交流] C语言的位运算是什么意思???

[复制链接]
发表于 2018-3-3 10:16:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请看这个:
rt<<1|1,这个怎么解释(注:这是线段树的代码部分,向递归函数传递参数)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-3 11:42:32 From FishC Mobile | 显示全部楼层
左移一位,两个数取或运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-3 12:01:28 | 显示全部楼层
这个……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-3 12:02:59 | 显示全部楼层
好吧,是我没说清楚。
问的是,为什么这里要有一个|运算??+1不可以吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-3 12:04:47 | 显示全部楼层
因为考虑到线段树的特殊性,当前结点的左孩子的值为当前结点值的两倍,右孩子比左孩子大一,那么理论上右孩子的值应该是当前结点的两倍再加一啊??为什么要|运算???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-3 12:45:05 | 显示全部楼层
ABC23 发表于 2018-3-3 12:04
因为考虑到线段树的特殊性,当前结点的左孩子的值为当前结点值的两倍,右孩子比左孩子大一,那么理论上右孩 ...
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int test = 1024;
  5.         printf("%d\n", test * 2 + 1);
  6.         printf("%d\n", test << 1 | 1);

  7.         return 0;
  8. }
复制代码

  1. 2049
  2. 2049
  3. 请按任意键继续. . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-3 17:52:59 | 显示全部楼层
void PushDown(int rt,int ln,int rn){
        //ln,rn为左子树,右子树的数字数量。
        if(Add[rt]){
                //下推标记
                Add[rt<<1]+=Add[rt];
                Add[rt<<1|1]+=Add[rt];
                //修改子节点的Sum使之与对应的Add相对应
                Sum[rt<<1]+=Add[rt]*ln;
                Sum[rt<<1|1]+=Add[rt]*rn;
                //清除本节点标记
                Add[rt]=0;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-3 17:53:36 | 显示全部楼层
代码来自:https://www.cnblogs.com/AC-King/p/7789013.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 23:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表