警院复试C程序设计学习笔记 第十一章——位运算

1.按位与按位或运算符

按位与:有0则0,全1则1

按位或:有1则1,全0则0

2.按位异或 按位左移 按位右移运算符

代码如下:

cpp 复制代码
#include <stdio.h>
void jh(void){		//交换两个变量的值,不使用中间变量
	int a = 3, b = 10;
	a = a^b;
	b = a^b;
	a = a^b;
	printf("%d, %d\n", a, b);	
}
int main(void){
	int a = 123;
	printf("%d, %d, %d\n", a<<38, a<<(38%32), 123<<38);		//让一个数值或变量左移大于自身长度的位数,或者使用左移右移移动的位数为负值,在不同的编译器中可能结果不一致,我们应该尽量避免这种情况的发生。 
	return 0;
}

执行结果如下:

3.位运算符的综合应用

代码如下:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
int add(int a, int b) {	//利用位运算来实现两个整数加法
	int c;
	while(c = a&b) {
		a = (c^a) | (c^b);
		b = c<<1;
	}
	return a|b;
}
int pv(int a, int index) {	//查看int a的二进制形式的第index位是1还是0
	if(index <= 0 || index > 32) {
		printf("函数参数有误,程序退出\n");
		exit(-1);
	}
	return 1&(a>>index-1);
}
int po(int a, int index) {	//将int a的二进制形式的第index位打开(如果为0就改成1,如果为1就不变)
	if(index <= 0 || index > 32) {
		printf("函数参数有误,程序退出\n");
		exit(-1);
	}
	return a|(1<<index-1);
}
int pc(int a, int index) {	//将int a的二进制形式的第index位关闭
	if(index <= 0 || index > 32) {
		printf("函数参数有误,程序退出\n");
		exit(-1);
	}
	return (~(1<<index-1)) & a;
}
unsigned pd(unsigned a, int start, int end) {	//返回a的二进制形式从start位到end位的内容
	if(start > 0 && start <= end && end <=32) {
		return a << 32-end >> 32-(end+1-start);
	}
	printf("pd函数参数有误,程序退出\n");
	exit(-1);
}
unsigned pf(unsigned a,unsigned b, int start, int end) {
	if(start > 0 && start <= end && end <=32) {
		int len = end+1-start;
		for(int i = 1; i <= len; ++i) {
			if(pv(b,i))
				a = po(a,start++);
			else
				a = pc(a,start++);
		}
		return a;
	}
	printf("pd函数参数有误,程序退出\n");
	exit(-1);
}
int mul(int a, int b){		//通过位运算进行整数相乘 
	int s = 0;
	for(int i = 1; i <= 32; ++i){
		if(pv(b,i))
			s += a<<i-1;
	}
	return s;
}
int chufa(int a, int b){
	if(b == 0){
		printf("0不能做除数,程序退出\n");
		exit(-1);
	}
	if(a == 0)
		return 0;
	int a0 = pv(a,32);
	int b0 = pv(b,32);
	int zheng;
	if(a0^b0 == 0)
		zheng = 1;
	else
		zheng = 0;
	if(a0){
		a = ~(a-1);
	}
	if(b0)
		b = ~(b-1);
	for(int i = 31; i >=1; --i){
		if(pv(a,i))
			break;
	}
	int shang = 0, bc = 1;
	while(i-- != 0){
		if(b>bc){
			shang <<= 1;
			if(i != 0)
				bc = bc<<1|pv(a,i);
		}
		else{
			shang = shang<<1|1;
			if(i != 0)
				bc = bc<<1|pv(a,i);
		}
	}
	return zheng?shang:~shang+1;
}
int main(void) {
	printf("%d\n", add(-23, 14));
	printf("%d\n", pv(13, 2));
	printf("%d\n", po(13, 2));
	printf("%d\n", pc(13, 3));
	printf("%u\n", pd(145, 3, 6));
	printf("%u\n", pf(15, 4, 2, 3));
	printf("%d\n", mul(12,4));
	printf("%d\n", chufa(13,2));
	return 0;
}

执行结果如下:

4.位段

相关推荐
XH华4 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__5 小时前
Web APIs学习 (操作DOM BOM)
学习
冷眼看人间恩怨5 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
数据的世界017 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐7 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
Uu_05kkq8 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
OopspoO9 小时前
qcow2镜像大小压缩
学习·性能优化
嵌入式科普10 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A10 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列