想知道某一位是否为1,只需和当前位对应的2的幂进行按位与运算即可. 如下示例,可以知道第6位是1,同理可知其他位是否为1,累加就能得到1的个数: 10001001 00000000 int cnt = 0; while (x) { cnt += x&1; x >>= 1; }…
#include "limits.h" #include "math.h" int abs(int number) { int const mask = number >> (sizeof(int) * CHAR_BIT - 1); return (number + mask) ^ mask; }   这是一个求绝对值的函数,看了它不禁想起负数在计算机中的构成.   负数在计算机中是按补码存储的,如何给定一个int型数,输出它的补码呢?以及给一个数的补码…
1. 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 2. 思路和方法 使用移位(<<)和 “| & !”操作来实现.1的二进制是:前面都是0,最后一位为1.每次向左移位一下,使得flag的二进制表示中始终只有一个位为1,每次与n做位与操作,这样就相当于逐个检测n的每一位是否是1.unsigned int flag = 1;  例如:5&1 = 101 & 001,1前面补0. 3. C++核心代码 3.1 位运算 class Solutio…
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位操作,但还是麻烦.直接按照int的位数,32或64,做这么多次移位操作就好了,每次移位操作累计是否为1.int的位数是32还是64,可以写一个函数来做到,而不是硬编码. class Solution { public: int NumberOf1(int n) { int cnt = 0; int…
[题目] 输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. [分析] 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减去1,那么原来处在整数最右边的1就会变成0,原来在1后面的所有的0都会变成1.其余的所有位将不受到影响.举个例子:一个二进制数1100,从右边数起的第三位是处于最右边的一个1.减去1后,第三位变成0,它后面的两位0变成1,而前面的1保持不变,因此得到结果是1011. 我们发现减1的结果是把从最右边…
一.题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   二.思路解析 此问题使用类似于二分查找的算法.右上角元素(第一行最后一列)的元素是第一个元素与第二行元素构成的递增排序的分割点,因为此元素的左面元素都比此元素小,此元素的下面元素都比此元素大(类似于二分查找中的中点处的元素).所以每次循环,比较目标元素target与右上角元素的大小关系,…
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. def find(target, array): i = j = len(array[]) - : base = array[i][j] if target == base: return True elif target > base: i += else: j -= return False pri…
整数n的二进制数中1的个数 编写一个函数,输入是一个整数,返回其二进制表达式中数字位数为 '1' 的个数 代码如下: int func(int n)//char ch { int count = 0; while(n > 0) { count++; n&=(n-1); } return count; } 原理:n&(n-1) 按位与 每计算一次,低位减一 如上图中二进制8与自身减一进行按位与操作 如上图二进制3与自身减一进行按位与操作 -由此可的: 8的二进制中有一位1,因此进行了一…
题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import java.util.HashSet; import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str…
转:http://toutiao.com/a4280977370/ [解法一] 可以举一个八位的二进制例子来进行分析.对于二进制操作,我们知道,除以一个 2,原来的数字将会减少一个0.如果除的过程中有余,那么就表示当前位置有一个1.以 10 100 010 为例:第一次除以 2 时,商为1 010 001,余为0.第二次除以 2 时,商为101 000,余为1.因此,可以考虑利用整型数据除法的特点,通过相除和判断余数的值来进行分析.于是有了如下的代码. 代码清单 2-1 [解法二]使用位操作 前…
问题描述: 输入一个整数n,求n的二进制表示中,一共有多少个1.例如n=8,二进制表示为00001000,二进制表示中有1个1.     分析: 如果一个数n不为0,那么n-1的二进制表示,与n的二进制表示相比,n的二进制表示最右边的1变为0,而最右边的1所对应的0全部变为1.其余位不受影响. 例如:n的二进制表示为****1000,则n-1的二进制表示为****0111,则n&(n-1)的二进制表示为****0000.将n二进制表示中最右边的1去掉了. 将n赋值为n&(n-1),继续循环…
Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime number of set bits in their binary representation. (Recall that the number of set bits an integer has is the number of 1s present when written in bin…
Codewars Write a function that takes an integer as input, and returns the number of bits that are equal to one in the binary representation of that number. You can guarantee that input is non-negative. Example: The binary representation of 1234 is 10…
printf函数没有这个功能,如果想打印一个数的二进制形式,就得自己计算.下面是我看到的最简便的算法: #include <stdio.h> int main(int argc, char *argv[]) { ; ;i>=;i--){ printf(<<i?:); } puts(""); ; } 1.如何理解 n&<<i?: ,加上括号: (n&(<<i))?: 2.因为int类型有4个字节,所以也就是32位二进制…
[本文链接] http://www.cnblogs.com/hellogiser/p/swap-odd-even-bits.html [分析] 假定一个数字是8位数,设为ABCDEFGH ABCDEFGH &10101010 后右移一位得到0A0C0E0G ABCDEFGH&01010101后左移一位得到B0D0F0H0 将上述两个结果0A0C0E0G和B0D0F0H0做或运算得到BADCFEHG [代码]  C++ Code  12345678910111213141516   /*  …
如果要输出int型的整数x,代码为: cout << bitset<>(x) << endl; 如果要输出long long型的整数x,代码为: cout << bitset<>(x) << endl;…
#include <iostream> #include <assert.h> /** * Key: * * get someone bit: num & (mode1bit<<N) * * check a few bits: num & (mode3bit<<shift) == What */ int replace(int num) { unsigned ; unsigned ; ; ; ) { && (num &…
第一种:使用n&(n-1)表示来计算有多少个1 int n=127; int count=0; while (n!=0){ count++; n=n&(n-1); } 第二种:使用移位操作 Integer input = in.nextInt(); int count=0; for(int i=0;i<30;i++){ int tmp = (input >> i)&0x00000001; if(tmp==1){ count++; } } System.out.pr…
(说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如把 9 表示成二进制是 1001,有 2 位是 1.因此如果输入 9,该函数输出是 2. 算法设计思想 计算一个整数的二进制表示中 1 的个数有多种算法.本文主要介绍两种算法,按位与运算算法和快速算法,更多算法,可以查看网友 zdd 的博文 “算法-求二进制数中1的个数”. 按位与运算算法思想很简单,…
出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位,k%2 ==0表示其是否是偶数,如果不是则说明当前二进制表示的最右边一位为1,当k==0成立的时候移位结束: 另外还可以使用‘消1’的方法,如果二进制表示A为'****1000',则A-1为'****0111',也就是我们仅关注二进制表示最右边的第一个 1,这样的话A&(A-1)的结果就可以将最右边的…
算法-求二进制数中1的个数 问题描述 任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4 这也是一道比较经典的题目了,相信不少人面试的时候可能遇到过这道题吧,下面介绍了几种方法来实现这道题,相信很多人可能见过下面的算法,但我相信很少有人见到本文中所有的算法.如果您上头上有更好的算法,或者本文没有提到的算法,请不要吝惜您的代码,分享的时候,也是学习和交流的时候. 普通法 我总是习惯叫普通法,因为我实在找不到一个合适的…
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题代码 法一: public class Solution { public int NumberOf1(int n) { int cnt = 0; while(n != 0){ n &= (n - 1); cnt++; } return cnt; } } 法二: public int NumberOf1(int n) { return Integer.bitCount(n); }…
面试题 15. 二进制中 1 的个数 题目描述 题目:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. Java 实现 方法一 public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int count=0; while(n!=0){ count+=(n&1); n=n>>>1; } return count; } }…
// 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #include <cstdio> int NumberOf1_Solution1(int n) { ; unsigned ; while (flag) { if (n & flag) count++; flag = flag << ; } return count; } int Nu…
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 牛客网链接 思路 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话).其余所有位将不会受到影响. 举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1.减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开…
Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime number of set bits in their binary representation. (Recall that the number of set bits an integer has is the number of 1s present when written in bin…
给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数. (注意,计算置位代表二进制表示中1的个数.例如 21 的二进制表示 10101 有 3 个计算置位.还有,1 不是质数.) 示例 1: 输入: L = 6, R = 10 输出: 4 解释: 6 -> 110 (2 个计算置位,2 是质数) 7 -> 111 (3 个计算置位,3 是质数) 9 -> 1001 (2 个计算置位,2 是质数) 10-> 1010 (2 个计算置位,2 是质数…
762. 二进制表示中质数个计算置位 给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数. (注意,计算置位代表二进制表示中1的个数.例如 21 的二进制表示 10101 有 3 个计算置位.还有,1 不是质数.) 示例 1: 输入: L = 6, R = 10 输出: 4 解释: 6 -> 110 (2 个计算置位,2 是质数) 7 -> 111 (3 个计算置位,3 是质数) 9 -> 1001 (2 个计算置位,2 是质数) 10->…
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目代码 /** * 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. * Created by YuKai Fan on 2018/8/28. */ public class countNumberOf1 { /** * 方法一: * *如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1, * 那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面…
Problem Description 统计给定文本文件中汉字的个数.   Input 输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本.   Output 对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行. [Hint:]从汉字机内码的特点考虑~   Sample Input 2 WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa! 马上就要期末考试了Are you ready?   Sample Output 14 9 #in…