C语言之位运算

news2025/4/21 10:38:23

一、什么是位运算

所谓位运算是指进行二进制位的运算
在系统软件中,常要处理二进位的问题
例如,将一个存储单元中的各二进位左移或右移一位,两个数按位相加等

二、位运算符和位运算

1、按位与 运算符(&)

参加运算的两个数据,按二进位进行“与”运算。如果两个相应的二进位都为1,则该位的结果值为1,否则为0

即0&0=0;0&1=0;1&0=0;&1=1;

例如: 3&5 并不等于8,应该是按位与。

在这里插入图片描述
如果参加&运算的是负数(如-3 & -5),则以补码形式表示为二进制数,然后按位进行“与”运算

按位与有一些特殊的用途:

  • 清零
  • 取一个数中某些指定位

实例:

#include <stdio.h>

int main(int argc, char *argv[])
{
	int num1 = 3;
	int num2 = 5;
	int res = num1 & num2;

	printf("res = %d\n", res);
	
	return 0;
}
[root@localhost 10_bits]# gcc test1.c -o test1
[root@localhost 10_bits]# ./test1
res = 1

负数在内存中是使用的补码表示的
负数的补码表示规则:最高位表示符号(0表示正数,1表示负数),数据值采用反码加1来表示
一个负数在内存中的表示:先看符号位,如果符号位负,最高位就为1,对于数据值,将负数的绝对值取反用二进制表示,在此基础上加1,就是负数的补码表示
-1在内存中存储的时候存储的是1111…11(32个1)

#include <stdio.h>

int main(int argc, char *argv[])
{
	int num1 = -1;
	int num2 = -3;
	int res = num1 & num2;

	printf("res = %d\n", res);
	
	return 0;
}
[root@localhost 10_bits]# gcc test1.c -o test1
[root@localhost 10_bits]# ./test1
res = -3

2、按位或运算符(|)

两个相应的二进位中只要有一个为1,该位的结果值为1

0|0=0; 0|1=1; 1|0=1; 1|1=1。

例如:060|017
将八进制数60与八进制数17进行按位或运算。
在这里插入图片描述
实例:

#include <stdio.h>

int main(int argc, char *argv[])
{
	int num1 = 3;
	int num2 = 5;
	int res = num1 | num2;   //011 | 101 == 111  == 7

	printf("res = %d\n", res);
	printf("num1 = %x\n", num1);
	
	return 0;
}
[root@localhost 10_bits]# gcc test1.c -o test1
[root@localhost 10_bits]# ./test1
res = 7
num1 = 3

3、“异或”运算符(∧)

异或运算符∧也称XOR运算符。它的规则是若参加运算的两个二进位同号,则结果为0(假);异号则为1(真)

0∧0=0; 0∧1=1; 1∧0=1; 1∧1=0;

如:
在这里插入图片描述
下面举例说明∧运算符的应用:

  • 使特定位翻转
    假设有01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行∧运算,即
    在这里插入图片描述

  • 与0相∧,保留原值
    如: 012∧00=012
    在这里插入图片描述
    因为原数中的1与0进行∧运算得1,0∧0得0,故保留原数。

  • 交换两个值,不用临时变量
    假如a=3,b=4。想将a和b的值互换,可以用以下赋值语句实现:

a=a∧b;
b=b∧a;
a=a∧b;

4、“取反”运算符(~)

~是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,1变0。
例如~025是对八进制数25(即二进制数00010101)按位求反。

5、左移运算符(<<)

用来将一个数的各二进位全部左移若干位。例如

a=a<<2

将a的二进制数左移2位,右补0。
若a=15,即二进制数00001111,左移2位得00111100,即十进制数60。
高位左移后溢出,舍弃不起作用。
左移1位相当于该数乘以2,左移2位相当于该数乘以22=4。。
但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。
左移比乘法运算快得多,有些C编译程序自动将乘2的运算用左移一位来实现,将乘2n的幂运算处理为左移n位

实例:

#include <stdio.h>

int main(int argc, char *argv[])
{
	int num1 = 3;
	int num2 = 5;
	int res = num1 | num2;   //011 | 101 == 111  == 7

	res = num1 << 3;
	printf("res = %d\n", res);
	printf("num1 = %x\n", num1);
	
	res = num2 >> 2;  //101 >>2 
	printf("res = %d\n", res);

	num2 = -23;   //10111-->11...01001
	res = num2 >> 3;   //11...01001>>3  --> 111...01  --> -3
	printf("res = %d\n", res);
    
	num2 =0x83fffff3;
	res = num2 << 3;
	printf("res = %d\n", res);

	return 0;
}
[root@localhost 10_bits]# gcc test1.c -o test1
[root@localhost 10_bits]# ./test1
res = 24
num1 = 3
res = 1
res = -3
res = 536870808   //说明左移的时候符号位是会丢弃的

6、右移运算符(>>)

a>>2表示将a的各二进位右移2位
移到右端的低位被舍弃,对无符号数,高位补0

右移一位相当于除以2,右移n位相当于除以2n。
在右移时,需要注意符号位问题。
对无符号数,右移时左边高位移入0。
对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0
如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的移入1。移入0的称为“逻辑右移”,即简单右移。移入1的称为“算术右移”

实例:

#include <stdio.h>

int main(int argc, char *argv[])
{
	int num1 = 3;
	int num2 = 5;
	int res = num1 | num2;   //011 | 101 == 111  == 7

	res = num1 << 3;
	printf("res = %d\n", res);
	printf("num1 = %x\n", num1);
	
	res = num2 >> 2;  //101 >>2 
	printf("res = %d\n", res);

	num2 = -23;   //10111-->11...01001
	res = num2 >> 3;   //11...01001>>3  --> 111...01  --> -3
	printf("res = %d\n", res);

	return 0;
}
[root@localhost 10_bits]# gcc test1.c -o test1
[root@localhost 10_bits]# ./test1
res = 24
num1 = 3
res = 1
res = -3

7、位运算赋值运算符

位运算符与赋值运算符可以组成复合赋值运算符如:&=, |=, >>=, <<=, ∧=
例如,a & = b相当于 a = a & b
a << =2相当于:a = a << 2

8、不同长度的数据进行位运算

如果两个数据长度不同(例如long型和int型)进行位运算时(如a & b,而a为long型,b为int型),系统会将二者按右端对齐
如果b为正数,则左侧16位补满0
若b为负数,左端应补满1
如果b为无符号整数型,则左侧添满0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/864669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单志刚的七年联盟链之路:在正确的方向,同行者总会相遇丨对话MVP

单志刚在联盟链的道路上已经坚守了7年。 从最初创业时期的“用字节开发”&#xff0c;到现在作为数金公共服务 (青岛) 有限公司&#xff08;下称“数金公服”&#xff09;区块链研发中心产品总监&#xff0c;落地全国首个以数字人民币结算的碳普惠平台“青碳行”App&#xff0…

PhotoShop2023 Beta AI版安装教程

从 Photoshop 开始&#xff0c;惊艳随之而来​ 从社交媒体贴子到修饰相片&#xff0c;设计横幅到精美网站&#xff0c;日常影像编辑到重新创造 – 无论什么创作&#xff0c;Photoshop 都可以让它变得更好。​ Photoshop2023 Beta版本安装教程和软件下载 地址&#xff1a;点击…

Redis:揭秘高效缓存与数据存储利器

Redis&#xff08;Remote Dictionary Server&#xff09;是一款开源的、内存数据结构存储系统&#xff0c;广泛应用于高性能缓存、消息队列、实时分析和计数器等场景。本文将深入探索Redis的重要概念、底层架构实现原理&#xff0c;指导程序员如何部署和使用Redis&#xff0c;并…

力扣70.爬楼梯(动态规划)

/*** author Limg* date 2023/08/11* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。* 每次你可以爬 1 或 2 个台阶。* 你有多少种不同的方法可以爬到楼顶呢&#xff1f; */#include<iostream> using namespace std; int climbStairs(int n); int main() {int n0;cin>&…

每天一道leetcode:139. 单词拆分(动态规划中等)

今日份题目&#xff1a; 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例1 输入: s "leetcode", …

Floyd算法

正如我们所知道的&#xff0c;Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展&#xff0c;三个for循环就可以解决问题&#xff0c;所以它的时间复杂度为O(n^3)。 Floyd算法的基本思想如下&#xff1a;从任意节点A到任意节点B的最短路径不外乎2种可能&#xff…

FreeRTOS(消息队列)

资料来源于硬件家园&#xff1a;资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、消息队列的基本概念 1、消息队列的基本概念 2、消息队列的通信机制 3、FreeRTOS中消息队列特性 4、消息队列应用场景 二、消息队列常用API 1、使用消息队列的典型流程 三、消…

烘焙光照贴图,模型小部分发黑

1.首先确定创建了光照贴图UV&#xff0c;其次确定不是溢色&#xff0c;这个最简单&#xff0c;所有模型材质设置为双面就可以&#xff0c;URP材质球的话这里就是设置双面 在scence界面Texel Validity模式里查看溢色&#xff0c;红色表示有溢色&#xff0c;绿色表示正常 2. 光照…

异常(中)创建自定义异常,throw,throws关键字抛出异常

文章目录 前言一、创建自定义异常二、在方法中抛出异常 1.使用throw关键字抛出异常2.使用throws关键字抛出异常总结 前言 该文介绍了Java的异常的创建自定义异常&#xff0c;让我们可以自己创建出一个异常&#xff0c;应对Java API中没有的基础的异常报错。throw关键字抛出异常…

【服务平台】Rancher运行和管理Docker和Kubernetes,提供管理生产中的容器所需的整个软件堆栈

Rancher是一个开源软件平台&#xff0c;使组织能够在生产中运行和管理Docker和Kubernetes。使用Rancher&#xff0c;组织不再需要使用一套独特的开源技术从头开始构建容器服务平台。Rancher提供了管理生产中的容器所需的整个软件堆栈。  完整软件堆栈 Rancher是供采用容器的团…

7款轻量级平面图设计软件推荐

平面图设计的痕迹体现在日常生活的方方面面&#xff0c;如路边传单、杂志、产品包装袋或手机开屏海报等&#xff0c;平面设计软件层出不穷。Photoshop是大多数平面图设计初学者的入门软件&#xff0c;但随着设计师需求的不断提高&#xff0c;平面图设计软件Photoshop逐渐显示出…

Ajax 笔记(四)—— Ajax 进阶

笔记目录 4. Ajax 进阶4.1 同步代码和异步代码4.2 回调函数地狱4.2.1 解决方法一&#xff1a;Promise 链式调用4.2.2 解决方法二&#xff1a;async 函数和 await 4.3 Promise.all 静态方法4.4 事件循环4.4.1 事件循环4.4.2 宏任务与微任务 4.5 案例4.5.1 案例一-商品分类4.5.2 …

“反AI斗士”马斯克宣布成立xAI :目标是了解宇宙真实本质

北京时间7月13日凌晨&#xff0c;马斯克在Twitter上宣布&#xff1a;“xAI正式成立&#xff0c;去了解现实。”马斯克表示&#xff0c;推出xAI的原因是想要“了解宇宙的真实本质”。Ghat GPT横空出世已有半年&#xff0c;国内外“百模大战”愈演愈烈&#xff0c;AI大模型的现状…

【golang】数组和切片底层原理

数组类型的值&#xff08;以下简称数组&#xff09;的长度是固定的&#xff0c;而切片类型的值&#xff08;以下简称切片&#xff09;是可变长的。 数组的长度在声明它的时候就必须给定&#xff0c;并且之后不会再改变。可以说&#xff0c;数组的长度是其类型的一部分。比如&a…

jQuery编程学习3(jQuery 其他方法: jQuery 拷贝对象、 jQuery 多库共存、jQuery 插件)

目录 jQuery 其他方法 1. jQuery 拷贝对象 $.extend()方法 2. jQuery 多库共存 问题概述&#xff1a; 客观需求&#xff1a; jQuery 解决方案&#xff1a;&#xff08;两种方式&#xff09; 3. jQuery 插件 jQuery 插件常用的网站&#xff1a; jQuery 插件使用步骤&…

Python-组合数据类型

今天要介绍的是Python的组合数据类型 整理不易&#xff0c;希望得到大家的支持&#xff0c;欢迎各位读者评论点赞收藏 感谢&#xff01; 目录 知识点知识导图1、组合数据类型的基本概念1.1 组合数据类型1.2 集合类型概述1.3 序列类型概述1.4 映射类型概述 2、列表类型2.1 列表的…

用python来爬取某鱼的商品信息(1/2)

目录 前言 第一大难题——找到网站入口 曲线救国 模拟搜索 第二大难题——登录 提一嘴 登录cookie获取 第一种 第二种 第四大难题——无法使用导出的cookie 原因 解决办法 最后 出现小问题 总结 前言 本章讲理论&#xff0c;后面一节讲代码 拿来练练手的&#xff…

【装个系统】教你安装全新Windows 11 全程展示,精彩无限

跟我一起&#xff0c;穿越时间&#xff01; Windows 11是微软最新的操作系统&#xff0c;相信已经没有人不知道了&#xff0c;但是很多人还不知道如何安装Windows 11&#xff0c;甚至不知道如何下载微软原版的安装文件&#xff0c; 别急&#xff0c;如果你没有安装文件&#…

纯C#使用Visionpro工具2 操作斑点工具

结果图 通过斑点工具中非圆性找取圆特征 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.For…

7年经验之谈 —— 软件测试工程师,如何工资过万?

对于测试工程师这个岗位而言&#xff0c;月薪过万并不是一件难事&#xff0c;笔者毕业时的第一份工作便拿到了7K的薪资&#xff0c;如今入职两年&#xff0c;薪资也堪堪过了万元大关。 我周边有不少想要入行这一行业的小伙伴都对我目前的工作和生活状态好奇&#xff0c;在此写一…