求1+2+……+n(位运算)】的更多相关文章

求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 我发现网上的做法都很神,各种理由编译的巧妙办法,就能间接地利用循环来解决,构造函数 递归什么的.想了好久,脑子里只有位运算...终于折腾出来了. 代码真傻,我真的没用循环... #include <stdio.h> #include <iostream> using namespace std; #define LL long long ,…
1.普通的求幂方法: 时间复杂度为O(n),对于比较大的数在1s限时内可能会TLE int pow(int base,int p){ int ans=1; for(int i=1;i<=p;i++) ans*=base; return ans; } 2.快速幂: 时间复杂度为logn (1)结合位运算 原理:指数p可转化为2进制形式 则basep=basei(1)*2^0+i(2)*2^1+i(3)*2^2+--  =basei(1)*2^0*basei(2)*2^1*basei(3)*2^2*…
求集合中选一个数与当前值进行位运算的max 这是一个听来的神仙东西. 先确定一下值域把,大概\(2^{16}\),再大点也可以,但是这里就只是写写,所以无所谓啦. 我们先看看如果暴力求怎么做,位运算需要给定\(01/10,00,11\)的关系,总共\(8\)种. 如果是暴力的话,我们的方法有两种, 第一种是比较喜闻乐见的, 我们对于当前数\(x\),暴力计算所有存在的数\(a_i\)中,\(x\oplus a_i\)的最大值,这样的复杂度是\(O(2^{16})\)的. 另外一种也是不难考虑到的…
我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注意:该方法只对除数是2的N次方幂时才有效. 在移位运算中我们可知,计算机中的数据都是0和1的序列,当我们把某个数字左移一位,该数字会扩大为原来的2倍:而将其右移一位时,该数字就会缩小为原来的1/2,即相当于对该数字做了一次被2整除的运算. 举例说明: 11的二进制是1011,如果右移一位的话,将变成0101,也就是5. 现在我们考虑11除以8…
<?php //按位运算:与1按位运算等于0,输出偶数.如果等于1,输出奇数 //输出偶数: for($i=0;$i<10;$i++){ if(($i & 1)==0){ echo $i;//输出:02468 }; } //输出奇数: for($i=0;$i<10;$i++){ if(($i & 1)==0){ echo $i;//输出:13579 }; } //求余运算:与2座余运算,等于0是偶数,等于1是奇数. //输出偶数: for($i=0;$i<10;$i…
[note]一类位运算求最值问题 给定一些数,让你从中选出两个数a,b,每次询问下列中的一个 1.a and b的最大值 2.a xor b的最大值 3.a or b的最大值 神仙们都是FWT,小蒟蒻只好orz 首先三种问题的思路都是从高位往低位贪心 对于xor,直接枚举每个数Trie树上贪心 对于and,如果可选集合中有大于等于两个数当前位为1,那么答案这一位也是1,并把这一位为0的数删去 对于or,先维护一个高维前缀和,枚举每一个数,如果某一位为0,我们就贪心的看能不能补上1, 相当于询问是…
我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不 允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注 意:该方法只对除数是2的N次方幂时才有效. 在移位运算中我们可知,计算机中的数据都是0和1的序列,当我们把某个数字左 移一位,该数字会扩大为原来的2倍:而将其右移一位时,该数字就会缩小为原来的1/2, 即相当于对该数字做了一次被2整除的运算. 举例说明: 11的二进制是1011,如果右移一位的话,将变成0101,也就是5. 现在我们考虑1…
分门别类刷算法,坚持,进步! 刷题路线参考: https://github.com/chefyuan/algorithm-base 大家好,我是刷题困难户老三,这一节我们来刷几道很有意思的求次数问题,它们都有同一类非常巧妙的解法. 这种解法是什么呢?往下看吧! 基础知识 在开始之前,我们最好先了解一些位运算的基础知识. 原反补码 先简单说一下,原码.反码.补码. 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.…
昨天在leetcode做题的时候做到了371,原题是这样的: 371. Sum of Two Integers Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example: Given a = 1 and b = 2, return 3. 因为之前完全没有在实际练习中使用过位运算,所以刚看到这道题目的时候我的第一反应是 1.用乘除代替加减,但是一想,…
转自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位异或:&:按位与: | :按位或 计算机系统中,数值一律用补码来表示:因为补码可以使符号位和数值位统一处理,同时可以使减法按照加法来处理. 对补码做简单介绍:数值编码分为原码,反码,补码,符号位均为0正1负. 原码 -> 补码: 数值位取反加1 补码 -> 原码: 对该补码的数值位继续 取反加1 补码 的绝对值(称为真值):正数的真值就是本身,负数的真值是各…