OJ随笔——【1102-海明距离】——位运算
题目如下:
Description |
||
|
海明距离是在指二进制情况下,一个整数变成另外一个整数需要翻转的位数。比如2转换到3需要翻转1位,所以2到3的海明距离是1。给你两个正整数x和y,(x,y<=1,000,000,000)求它们的海明距离。 输入 第一行是一个整数N,表示样例的个数。以后每行两个整数x和y。 输出 每行输出一个整数,及对应样例的结果。
|
||
Sample Input |
||
2 |
||
Sample Output |
||
2 |
分析思路:
简单来说就是一个多样例输入,对于每一组输入都转化成二进制然后进行逻辑上的异或运算,即比较两个二进制数对应的每一位,同为0或同为1则返回0,一个为0一个为1则返回1。例如2的二进制表示为……00000010,3的二进制表示为……00000011,他们进行异或运算的结果为……00000001,也就是最后一位不同需要“翻转”。所以海明距离实际就就是看两个数进行二进制的异或运算后为1的位数有几位。
核心问题:
有了上面的思路,现在的问题就是要怎么把输入的十进制的数转化为二进制进行异或运算呢?开始想的是把十进制数通过取模运算一步步转换成二进制数储存在数组中,然后利用循环分别比较每一位,两个数在那一位上的数不相同则计数+1。
后来才回忆起来C语言里提供了“位运算符”,可以直接通过a^b对这两个十进制数的二进制形式进行异或运算(不需要自己转换进制)。详情可参考【http://blog.csdn.net/chen825919148/article/details/8049069】
| 运算符 | 作用 |
| & | 位逻辑与:按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。 例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。 |
| | | 位逻辑或:按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。 例如:9|5可写算式如下: 00001001|00000101=00001101 (十进制为13)可见9|5=13 |
| ^ | 位逻辑异或 :按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如 9^5可写成算式如下: 00001001^00000101=00001100 (十进制为12) |
| ~ | 位逻辑反 :求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110 |
| >> | 右移:右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。 |
| << | 左移:左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。 |
最后附上我的程序源码:
#include<stdio.h>
int main()
{
int n,i,a,b;
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%d%d",&a,&b);
a^=b; //a,b的异或运算,把运算结果储存在a中;
b=; //把b重置为0,用于计数;
while(a)
{
if(a&) //二进制a于(二进制)...00001的且运算,同1为1,其余为0;即异或运算后的结果最后一位为1时计数+1
b++;
a>>=; //对a进行右移位运算,去掉最低位,下一次循环比较上一位,直至a的值为0;
}
printf("%d\n",b); //输出异或运算后结果为1的位数有几位,即两个数的海明距离;
}
return ;
}
OJ随笔——【1102-海明距离】——位运算的更多相关文章
- 九度OJ 1256:找出两个只出现了一次的数字 (位运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:568 解决:186 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的 ...
- bzoj4811 [Ynoi2017]由乃的OJ 树链剖分+位运算
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4811 因为位运算的结果有可合并性,所以可以树链剖分,线段树维护: 细节很多,特别要注意从左往 ...
- nyist oj 138 找球号(二)(hash 表+位运算)
找球号(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描写叙述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中.每一个球上都有一个整数编号i(0<=i< ...
- luogu 5354 [Ynoi2017]由乃的OJ LCT+位运算
如果做过起床困难综合征的话应该很快就能有思路,没做过那道题的话还真是挺费劲的. 我们不知道要带入的值是什么,但是我们可以知道假设带入值得当前位为 $1$ 时这一位在经过位运算后是否为 $1$. 至于这 ...
- 黑马程序员_毕向东_Java基础视频教程——位运算练习(随笔)
位运算(练习) 最有效率的方式算出 2乘以 8等于几 2 << 3 = 2 * 2^3 = 2 * 8 = 16 对于两个整数变量的值进行互换(不需要第三方变量) class Test { ...
- 海量数据相似度计算之simhash和海明距离
通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析.分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法.欧式距离.Jaccard相 ...
- Tag Archives: 海明距离
在前一篇文章 <海量数据相似度计算之simhash和海明距离> 介绍了simhash的原理,大家应该感觉到了算法的魅力.但是随着业务的增长 simhash的数据也会暴增,如果一天100w, ...
- Matlab计算两集合间的海明距离
一.问题描述 B1[1 2 3 4 5 6 7 8 9] B2[12 13 14 21 31 41 51 1 1 81 1 1] 两个十进制矩阵,行数不一样,分别是n1和n2,列数必须一致,为nwo ...
- 使用simhash以及海明距离判断内容相似程度
算法简介 SimHash也即相似hash,是一类特殊的信息指纹,常用来比较文章的相似度,与传统hash相比,传统hash只负责将原始内容尽量随机的映射为一个特征值,并保证相同的内容一定具有相同的特征值 ...
随机推荐
- html网页中加载js脚本 下载下来是乱码(文件编码格式)
问题描述: 在一个index.html网页中,引入了jquery脚本,但是却出现错误,提示$ is not defined <!DOCTYPE html> <html lang=&q ...
- Oracle - java创建Oracle 的触发器
Oracle - java创建Oracle 的触发器 今天碰到这个问题,遇到点问题,到这来 总结一下解决的办法, 需求,为一个用户当中的表增加一个自动增长列,我还没有学Oracle 的这部分,只是简单 ...
- 数据结构--汉诺塔递归Java实现
/*汉诺塔递归 * 1.将编号0-N-1个圆盘,从A塔座移动到B上面 * 2.将编号N的1个圆盘,从A移动到C上面 * 3.最后将B上面的N-1个圆盘移动到C上面 * 注意:盘子的编号从上到下1-N ...
- JS中的this的应用总结
简述this的用法 "this是由被调用的方式确定"这个事实,使得this可以被改变,从而为函数增加了动态性,可变性,使得变成更加灵活.目前因为工作经验有限,暂时总结一下五种情况下 ...
- 基于Django的python验证码
验证码 在用户注册.登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力 使用验证码也是一种有效的防止crsf的方法 验证码效果如下图: 验证码视 ...
- ldap数据库--ldapsearch,ldapmodify
简单介绍一下ldapsearch命令,在ldap搜索条目时很有用,只要适当调整filter就可以. 命令如下: ldapsearch -h hostname -p port -b baseDN -D ...
- riot.js教程【六】循环、HTML元素标签
前文回顾 riot.js教程[五]标签嵌套.命名元素.事件.标签条件 riot.js教程[四]Mixins.HTML内嵌表达式 riot.js教程[三]访问DOM元素.使用jquery.mount输入 ...
- 老男孩Python全栈开发(92天全)视频教程 自学笔记01
day1课程目录: 开课介绍(1) 开课介绍(2) 开课介绍(3) 电脑简史(1) 电脑简史(2) 计算机结构 day1课程内容梳理: 导师介绍: Alex Li(金角大王):买了一辆特斯拉,喜欢姑娘 ...
- MyBatis《1》
MyBatis入参考文档:http://mybatis.org/mybatis-3/zh/ 1.使用MyBatis前的准备 1.增加Maven依赖 <dependency> <g ...
- 逻辑回归,附tensorflow实现
本文旨在通过二元分类问题.多元分类问题介绍逻辑回归算法,并实现一个简单的数字分类程序 在生活中,我们经常会碰到这样的问题: 根据苹果表皮颜色判断是青苹果还是红苹果 根据体温判断是否发烧 这种答案只有两 ...