位运算:

左移:m<<n将m左移n位,左移后低位补充0;

右移:m>>n将m右移n位,右移后高位补充的是符号位,负数补充1,整数补充0.(正数的边界值为(1,ox7FFFFFFF),负数的边界值为(ox80000000,oxFFFFFFFF))

题目一:请实现一个函数,输入一个整数,输出这个数的二进制表示中1的个数。

思路一:将二进制数i与1相与,判断是否为1,然后将tag=1左移一位得到tag=2,然后再与i相与,循环结束的条件是tag==0;该算法的时间复杂度为输入的i的位数。

#include <iostream>
using namespace std;
int numberOf1(int n)
{
int count=0;
int tag=1;
while(tag)
{
if(tag&n)
count++;
tag=tag<<1;
}
return count;
} void main()
{ int i;
while(cin>>i)
{
cout<<numberOf1(i)<<endl;
}
}

思路二:把一个整数n减去1,再和原来的整数与运算,会把该整数的最右边的1变成0,那么,一个整数的二进制中有多少个1,就可以进行多少次这样的操作。循环结束的条件是n为0;

#include <iostream>
using namespace std;
int numberOf1(int n)
{
int count=0; while(n)
{
++count;
n=(n-1)&n;
}
return count;
} void main()
{ int i;
while(cin>>i)
{
cout<<numberOf1(i)<<endl;
}
}

Java代码:

public class ByteCompute {
public int byteCompute(int n){
int tag=1;
int count=0;
while(tag!=0){//由于int类型的函数是32位因此要循环32次
if((n&tag)!=0)
count++;
tag=tag<<1; }
return count;
}
public int byteCompute1(int n){
int count=0;
while(n!=0){//由于每次n和n-1相与都会导致,n的最右边的为1的元素变成0,因此总共要循环的次数就是1的个数次。
count++;
n=(n-1)&n;
}
return count;
} public static void main(String[] args){
int n=3;
ByteCompute bc=new ByteCompute();
int count=bc.byteCompute(n);
int count1=bc.byteCompute1(n);
System.out.println(count+" "+count1);
}
}

题目二:用一条语句判断一个整数是不是2的整数次方。

思路:一个整数如果是2的整数次方,那么它的二进制表示中有且仅有一个位是1,而其他所有位都是0,根据上面的分析,把这个整数减去1后再与自己相与,唯一的1也会变成0.

题目三:输入两个整数m和n,计算需要改变n的几位可以得到m。

第一步先将这m和n异或,然后再数1的个数。

题目四:在Excel2003中,用A表示第一列,用B表示第二列,用C表示第三列....用z表示第26列,AA表示第27列,用AB表示第28列.....依次类推,请写一个函数输入字母表 示列号,输出是第几列。(十进制转换为26进制的问题)

思路:写一个函数返回值为整型,如果输入的字符串s为空则返回空,定义并初始化一个最终的返回值sum=0,设置一个行动下标i,当i满足小s.length()时,定义一个临时的整型变量temp=s[i]-'A'用来存放单个位置上的由字符变成的数字。只有当temp是在0~26的范围之间的时候才有sum=sum*26+temp+1.

#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int StringToInt(const string& str)
{
int length = str.length();//这里也可用str.size(). if(length < )//如果没有输入字符,则报错。
{
cout << "Invalid input" << endl;
return -;
} int sum = ;//如果输入的字符为空字符,输出为0. for(int i = ; i < length; i++)
{
int temp = str[i] - 'A';
if(temp >= || temp < )
{
cout << "Invalid input" << endl;
return -;
}
sum = *sum + temp + ;
}
return sum; }
int main()
{
string str;
while(getline(cin,str))//这里如果用cin >> str,不能输入空的字符串。
cout << StringToInt(str)<<endl;
return ;
}

java代码:

public class StringToInt {
public int stringToInt(String str){
int len=str.length();
if(len<0)
throw new RuntimeException("inVaild input!");
int sum=0;//输入为空的时候,输出0;
for(int i=0;i<len;i++){
int temp=str.charAt(i)-'A';
if(temp<26&&temp>=0)
sum=26*sum+temp+1;
}
return sum;
}
public static void main(String[] args){
String str="AAZ";
StringToInt sti=new StringToInt();
int sum=sti.stringToInt(str);
System.out.println(sum+" ");
}
}

剑指offer—算法之位运算(二进制中1的个数)的更多相关文章

  1. 剑指Offer面试题:9.二进制中1的个数

    一.题目:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 二.可能引起死循环的解法 一个 ...

  2. 剑指Offer面试题:8.二进制中1的个数

    一 题目:二进制中1的个数 题目:请实现一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. 二 可能引起死循环的解法 // 计算整数的二 ...

  3. 《剑指offer》面试题10 二进制中1的个数 Java版

    书中方法一:对于每一位,用1求与,如果为1表明该位为1.一共要进行32次,int4字节32位. public int check(int a){ int result = 0; int judge = ...

  4. 《剑指offer》面试题15. 二进制中1的个数

    问题描述 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输入:00000 ...

  5. 剑指Offer(书):二进制中1的个数

    题目:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析:下面这两种方法都可以,不过第二种更好一些. public int numberOf1(int n) { int count ...

  6. 剑指offer算法_位运算求和

    不用+,-,*,/运算求和,可以分成三步: 1.计算两个数字的异或值,相当于只计算每一位的和,不计算进位,得出结果sum: 2.计算两个数字的与值,相当于求出两个数字的进位,然后左移一位,相当于进位, ...

  7. 剑指offer 11. 位运算 二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.   //思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数     private stat ...

  8. 剑指offer编程题Java实现——面试题10二进制中1的个数

    题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...

  9. 剑指offer算法总结

    剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行 ...

随机推荐

  1. C# JSON字符串序列化与反序列化

    JSON与c#对象转换http://hi.baidu.com/donick/item/4d741338870c91fe97f88d33 C# JSON字符串序列化与反序列化 – http://www. ...

  2. Lines演示程序

    #include "stdafx.h"#include "d3d9.h"#include "d3dx9.h" #pragma comment ...

  3. Android 核心分析 之八Android 启动过程详解

    Android 启动过程详解 Android从Linux系统启动有4个步骤: (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) ...

  4. linux下python启动第三方程序,并控制关闭

    import subprocess import os import signal p = subprocess.Popen("recordmydesktop -o /home/test/t ...

  5. Android APP安全评估工具 Drozer - 使用介绍

    一.列出drozer当前可用的所有模块dz> list dz> list app.activity.forintent Find activities that can handle th ...

  6. SSIS ->> Logging

    SSIS提供了Event Handler之外的另一种方法捕捉Event和获取需要的信息,这种方法是Logging.SSIS的Logging针对不同的组件可以提供比Event Handler更多的Eve ...

  7. 常用WinPE

    微PE工具箱:http://www.wepe.com.cn/ 绝对PE工具箱:http://dl.pconline.com.cn/download/64736.html 通用PE工具箱:http:// ...

  8. gitlab的搭建和linux客户端的连接

    一.安装 1.新建 /etc/yum.repos.d/gitlab-ce.repo,添加以下内容 1 2 3 4 5 6 7 [gitlab-ce] name=gitlab-ce baseurl=ht ...

  9. Lantern免费使用教程【转】

    转自:http://www.mfbuluo.com/13710.html 自从谷歌去年退出中国后,可能是意识到中国市场的潜力,所说这款Lantern免费的软件,背后有谷歌的资助,这一点部落无法肯定. ...

  10. AOJ - 0009 Prime Number (素数筛法) && AOJ - 0005 (求最大公约数和最小公倍数)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34870 求n内的素数个数. /* ********************* ...