ACM道路之一:基础算法(位运算)

lowbit(x) : 返回x的最后一位1

lowbit(100010)   = 10

lowbit(11011000) = 1000

lowbit(x) = x&(-x)   = x & (~x+1)  : -x  x的补码 = x 取反+1

给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。

输入格式

第一行包含整数n。

第二行包含n个整数,表示整个数列。

输出格式

共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。

数据范围

1≤n≤1000001≤n≤100000,
0≤数列中元素的值≤1090≤数列中元素的值≤109

输入样例:

5
1 2 3 4 5

输出样例:

1 1 2 1 2

代码:
#include<bits/stdc++.h>
using namespace std;
int lowbit(int x)
{
    return x&-x;
}
int main()
{
    int n;
    int k;
    cin>>n;
    while(n--)
    {
        cin>>k;
        int res=0;
        while(k)
        {
            k-=lowbit(k);
            res++;
        }
        cout<<res<<" ";
    }
}

n>>k   n右移k位

n>>1  n右移1位 == n/2

int n=10;

undesigned int k =  -n;

显示二进制数

    for(int i=31;i>=0;i--)
    {
        cout<<(k>>i&1);
    }

k:11111111111111111111111111110110

n:00000000000000000000000000001010

k+1:11111111111111111111111111110111

(k+1)&n:0000000000000000000000000000010<<<<<<<---------------------->>>>>>10

原文地址:https://www.cnblogs.com/YNorcoding/p/12241450.html

时间: 2024-08-10 18:50:01

ACM道路之一:基础算法(位运算)的相关文章

java加密解密算法位运算

一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算会把加密后的字符串还原为原有字符串的值.效果图如下: 二.实现过程 1 package com.itxxz; 2 3 import java.util.Scanner; 4 5 /** 6 * java加密解密算法 7 * 8 * @author 螃蟹 9 * 网站:IT学习者 10 * 网址:ht

学ACM的必备基础算法

不知是哪位大牛写的,迷茫的参考一下吧! 参加ACM比赛一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.acm主要是考算法的,主要时间是花在思考算法上,不是花在写程序与debug上. 第一阶段: 练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打 出来. 1.最短路(Floyd, Dijstra,BellmanFord) 2.最小生成树(先写个prim, kruscal要用并查

Apriori算法-位运算-C语言

原文地址:http://blog.csdn.net/liema2000/article/details/6118423 ///////////////////////////////////////////////////////////////////////////** 文件名称:FAST apriori.cpp * 摘 要:采用位运算提高算法的效率 * 将每一项抽象为数值,通过与运算判断是否存在,abcde为16,8,4,2,1换成2进制,各占一个位置,互相不干扰.局限于字母.换算的比较字

数据结构与算法-位运算

位运算位运算是把数字用二进制表示之后,对每一位上的0或者1的运算.理解位运算的第一步是理解二进制.二进制是指数字每一位都是0或者1,如十进制的2转换为二进制之后是10,而十进制的10转换为二进制之后是1010.在程序员圈子里有一个流传了很久的笑话,说世界上有10种人,一种人知道二进制,另一种人不知道二进制. 下面是几个常见的关于位运算的算法题:基本位运算位运算总共只有5种运算:与&,或|,异或^,左移<<,右移>>.与,或,异或的运算规则: 左移,右移运算规则:左移运算m

Java 基础 之 位运算

http://www.verejava.com/?id=16992602784016 public class Operation5 { public static void main(String[] args) { //位运算 /* 包括: 与 &, 或 |, 取反 ~, 异或 ^ 带符号左移<<, 带符号右移 >>, 无符号右移 >>> 1. & 就是二进制位如果都是1则为1,否则为0 2. | 就是二进制位如果都是0则为0,否则为1 3.

算法——位运算

&:按位与. |  :按位或. ~ :按位取反,带符号位.(注意和!的区别,!只是逻辑取反)  ^ : 异或也叫半加运算:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0. >> : 表示右移,算数右移,如果该数为正,高位补符. >>>:表示无符号右移,也叫逻辑右移,高位补零. 小操作: 1. 判断奇偶数 a & 1 2. 交换变量 a ^= b, b ^= a, a ^= b 3. 乘以(除以)2的n次方:左移,右移:取模运算:a % (2 ^ n) 等价于

[算法]位运算问题之三(实现加减乘除)

题目: 给定32位整数a和b,可正.可负.可0,不能使用算术运算符,可分别实现a和b的加减乘除运算. 加法运算: 无进位相加: a: 001010101 b: 000101111 a^b 001111010 只考虑进位: a   001010101 b   000101111 (a&b)<<1 000001010 把完全不考虑进位的相加值与只与考虑进位的产生值再相加,就是最后的结果.重复这样的过程,直到进位产生的值完全消失,说明所有的过程都加完了. public static int

[算法]位运算问题之一

一.不用额外变量交换两个整数的值 a=a^b; b=a^b; a=a^b; 或者: a=a+b; b=a-b; a=a-b; 二.不同任何比较判断找出两个数中较大 有两种方法,方法一有一定的局限性,a-b的值可能溢出,这样溢出后符号改变,返回结果就不正确. 而方法二对a和b是否异号进行了判断,如果同号,则按照方法一返回,否则直接返回正的数就行. a-b的值如果为0的处理按照大于0处理. //如果n为1,则返回0:如果n为0,则返回1 public static int flip(int n) {

ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】

FZU 2105  Digits Count Time Limit:10000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Practice Description Given N integers A={A[0],A[1],...,A[N-1]}. Here we have some operations: Operation 1: AND opn L R Here opn, L and R are integer

[算法]位运算之二

题目一: 给定一个整形数组arr和一个大于1的整数k.已知arr中只有1个数出现了奇数次,其他的数都出现了偶数次,请返回出现了奇数次的数. 时间复杂度为O(N),额外空间复杂度为O(1). 思路: 整数n与0异或的结果是n,整数n与整数n异或的结果是0.所以先申请一个整形变量,记为eO.把eO和每个数异或(eO=eO^当前数),最后eO的值就是出现了奇数次的那个数. 异或运算满足交换律和结合律. public static void printOddTimesNum1(int[] arr) {