IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法基础--位运算 -> 正文阅读

[数据结构与算法]算法基础--位运算

1、位运算符(C语言中的六个位运算符)

&与(有0为0)
|或(有1为1)
^异或(相同为0 不同为1)
~
>>右移
<<左移

2?例题

1 如何找数组中唯一成对的那个数

1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法将它找出来。

2.1 解题思路

方法一:利用位运算符中的异或运算

????????????????????????A^A =0;? A^0=A (相同为0 不同为1)

具体应用:(1^2^3...^1000)^(1^2^3...^1000^r)=r

2.2 代码展示


# include <stdio.h>
# include <time.h>
# include <stdlib.h>

int main(void)
{
	srand((unsigned)time(NULL));//产生随机数的种子 
	
	int a[1001];
	int i;
	int result = 0;//最终用来存储重复的数  
	
	for ( i=0; i<1001; i++ )//给数组赋1-1000的值 
	{
		a[i] = i + 1;
	}
	a[1000] = rand() % 1000+1;//生成[1,1000]范围内的随机数 
	/* rand()%(b-a+1)+a 范围[a,b] */
	
	for ( i=1; i<1001; i++ )//1^2^3...^1000
	{
		result ^= i;	
	} 
	for ( i=0; i<1001; i++ )//在把上面的结果与1^2^3...^1000^a[1000] 
	{ 
		result ^= a[i];	
	} 
	
	printf("%d", result);
	
	return 0;
}

方法二:开辟辅助空间

# include <stdio.h>
# include <time.h>
# include <stdlib.h>

int main(void)
{
	srand((unsigned)time(NULL));//产生随机数的种子 
	
	int a[1001];
	int b[1001]={0};//辅助空间 记录的是对应下表的数字出现的次数 
	int i;  
	
	for ( i=0; i<1001; i++ )//给数组赋1-1000的值 
	{
		a[i] = i + 1;
	}
	a[1000] = rand() % 1000+1;//生成[1,1000]范围内的随机数 
	/* rand()%(b-a+1)+a 范围[a,b] */
	
	for ( i=0; i<1001; i++ )
	{
		b[a[i]]++;//原数组中没出现一个值 就对该值为下标的辅助数组值加一  
	} 
	for ( i=0; i<1001; i++ )
	{
		if ( b[i] == 2 )
		{
			printf("%d", a[i]);
			return 0;
		}
	}
	
	return 0;
}

2 找出落单的那个数

一个数组中除了某一个数字外,其它的数字都出现两次。请写程序找出这个只出现一次的数字。

2.1 解题思路

这题比第一题要简单一些 与第一题中用到的知识点是一样的?

? ? ?A^A^B^B^C = C (因为有异或交换律 所以顺序无所谓)

2.2 代码展示

# include <stdio.h>
# include <time.h>
# include <stdlib.h>

int main(void)
{
	srand((unsigned)time(NULL));//产生随机数的种子 
	
	int N = 1001;
	int a[N];
	int i;
	int result;//异或后的结果  
	
	for ( i=0; i<=(N-2)/2; i++ )//给数组赋[1,500]的值 
	{
		a[i] = a[N-2-i] = i+1;//a[i] 和 a[N-2-i] 的值相等  
	}
	a[N-1] = rand() % 500+501;//生成[501,1000]范围内的随机数 
	/* rand()%(b-a+1)+a 范围[a,b] */
		
	for ( i=0; i<N; i++ )//连续异或 重复的数会被消掉 只出现一次的数会被保留下来  
	{
		result ^= a[i];
	}
	
	printf("%d", result);
		
	return 0;
} 

3、二进制中1的个数

请输入一个函数,输入一个整数,输出该二进制表示中1的个数。

例如:9的二进制表示为1001,有2位是1

3.1 解题思路?

可以利用&(或运算)和>>(右移)

其中& 全为1是结果才是1 就正好可以很完美的解决题目的要求

3.2 代码展示

# include <stdio.h>

int main(void)
{
	int n;
	int flag = 0;//记录个数  
	
	scanf("%d", &n);
	
	while( n )
	{
		if ( n & 1 )//最低位为1时 flag加一 
			flag++;
		n = n >> 1;	//每一次循环都右移一次 
	}
	
	printf("二进制表示中有%d个1", flag);
	
	return 0;	
} 

4 是不是2的整数次方

用一条语句判断一个数是不是2的整数次方

4.1 解题思路

这里直接说一下 我也是看了很多文章才知道 原来2的整数次方有一个特点 2的整数次方的二进制中只有1个1,其它全为0??

4.2 代码展示

if ( n&(n-1) == 0 )
    printf("YES");
else
    printf("NO");

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-29 23:20:21  更:2022-01-29 23:20:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:48:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码