警院复试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.位段

相关推荐
@月落26 分钟前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
世俗ˊ32 分钟前
CSS入门笔记
前端·css·笔记
6230_36 分钟前
git使用“保姆级”教程1——简介及配置项设置
前端·git·学习·html·web3·学习方法·改行学it
一名路过的小码农37 分钟前
C/C++动态库函数导出 windows
c语言·开发语言·c++
m0_6312704039 分钟前
标准c语言(一)
c语言·开发语言·算法
万河归海42839 分钟前
C语言——二分法搜索数组中特定元素并返回下标
c语言·开发语言·数据结构·经验分享·笔记·算法·visualstudio
小周的C语言学习笔记44 分钟前
鹏哥C语言36-37---循环/分支语句练习(折半查找算法)
c语言·算法·visual studio
凌肖战2 小时前
力扣上刷题之C语言实现(数组)
c语言·算法·leetcode
李小星同志2 小时前
高级算法设计与分析 学习笔记6 B树
笔记·学习
霜晨月c2 小时前
MFC 使用细节
笔记·学习·mfc