位运算:按位与、按位或、按位异或、按位左移、按位右移

这篇具有很好参考价值的文章主要介绍了位运算:按位与、按位或、按位异或、按位左移、按位右移。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、基础知识补充

    (1)位运算

    (2)二进制的详细操作

二、位运算

    (1)按位与(&)

    (2)按位或(|)

    (3)按位异或(^)

      (4)按位左移(<<)

    (5)按位右移(>>)

三、位运算例题

    题目描述:

    题解:

四、共勉


一、基础知识补充

    (1)位运算

    位运算符要比一般的算术运算符速度要快,而且可以实现一些算术运算不能实现的功能(文章后面会举例子)。如果在完成代码的时候需要做到开发效率高,位运算是必不可少的。位运算用来对二进制位进行操作,包括:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、按位左移(<<)、按位右移(>>) 。

    (2)二进制的详细操作

    在进行位运算的时候,会用到大量的二进制源码、反码、补码,所以有需要的朋友可以看看我的上一篇文章哦!!!

    文章的链接:  http://t.csdn.cn/dasNJ

二、位运算

    (1)按位与(&)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:将整数从十进制转化为二进制数,上下比较,有零则零 ,两个都是 1 才是 1。

    3. 运算编码:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例:将 3 & (-5)

// int 为整型4个字节有32个bit位
int a = 3 ;  // 00000000 00000000 00000000 000000011   正数,源码=反码=补码
int b = -5 ; // 10000000 00000000 00000000 000000101   -5的源码
             // 11111111 11111111 11111111 111111010   -5的反码
             // 11111111 11111111 11111111 111111011   -5的补码

int c = a & b ;  //按位与:上下比较,有零则零,两个都为 1 才是 1

             // 00000000 00000000 00000000 00000011   3的补码
             // 11111111 11111111 11111111 11111011   -5的补码

     最终结果// 00000000 00000000 00000000 00000011   ----(3)整数,源码=反码=补码

    (2)按位或(|)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:上下比较有 1 则为 1,两个都是 0 才是 0

    3. 运算编码:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例:3 |  (-5)

// int 为整型有4个字节,32个bit位
int a = 3 ;  // 00000000 00000000 00000000 00000011   正数,源码=反码=补码
int b = -5 ; // 10000000 00000000 00000000 00000101   -5的源码
             // 11111111 11111111 11111111 11111010   -5的反码
             // 11111111 11111111 11111111 11111011   -5的补码

int c = a | b ;    //按位或:上下比较,有 1 则 1,两个都是 0 才是 0

              // 11111111 11111111 11111111 11111011   -5的补码
              // 00000000 00000000 00000000 00000011   3的补码

      最终结果// 11111111 11111111 11111111 11111011  为负数,是补码
             // 11111111 11111111 11111111 11111010   是反码,补码-1
             // 10000000 00000000 00000000 00000101   是源码,各个位按位取反-----(-5)

    (3)按位异或(^)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:上下比较,相同为 0 ,相异为 1 

    3. 运算编码:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例: 3  ^ (-5)

// int 为整型有4个字节32个bit位
int a = 3 ;  // 00000000 00000000 00000000 00000011  正数,源码=反码=补码
int b = -5 ; // 10000000 00000000 00000000 00000101  负数,(-5)的源码
             // 11111111 11111111 11111111 11111010  -5的反码
             // 11111111 11111111 11111111 11111011  -5的补码

int c = a ^ b ; //按位异或:上下比较,相同为0,相异为1


// 11111111 11111111 11111111 11111011  -5的补码
// 00000000 00000000 00000000 00000011  3的补码


//异或 :11111111 11111111 11111111 11111000  负数,补码
      // 11111111 11111111 11111111 11110111  反码
      // 10000000 00000000 00000000 00001000  源码-----(-8)

      (4)按位左移(<<)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:把二进制数向左移动一位,左边溢出的丢弃,右边补零

    3. 编码运算:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

    举例:将 a = 4 左移一位

// int 为整型,有4个字节,32个bit位
int a = 4 ;       // 00000000 00000000 00000000 00000100,正数,源码=反码=补码
int b = a << 1 ;  // 把a左移一位,左边丢弃,右边补零
                  // 00000000 00000000 00000000 00001000 ----(8)

    (5)按位右移(>>)

    1. 应用范围:必须在整数范围内进行

    2. 运算方法:把二进制数向右移动一位,右边丢弃,左边补原符号位

    3. 编码运算:补码

    4. 输出方式:整形表达式计算使用在内存中的是补码,打印和看到的都是源码。

int a = -4 ; // 10000000 00000000 00000000 00000100 负数,源码
             // 11111111 11111111 11111111 11111011  -4的反码
             // 11111111 11111111 11111111 11111100  -4的补码
int b = >> 1 ; // 把b向右移动一位,右边丢弃,左边补原符号位
               // 11111111 11111111 11111111 11111110  负数,补码
               // 11111111 11111111 11111111 11111101  反码
               // 10000000 00000000 00000000 00000010  源码----(-2)

    此时我们可以发现一个整数,左移有乘2的效果,右移有除二的效果。

三、位运算例题

    题目描述:

    不创建第三变量,进行变量 a , b 的数值交换

    题解:

    (方法一):简单数位运算,但是不能满足所有需求

#include <stdio.h>
int main()
{
	int a = 5;
	int b = 3;
	a = a + b;
	b = a - b;
	a = a - b;
	printf("a=%d b=%d\n", a, b);
	return 0;
}

    若 a , b 两个数相加的和刚好超过 int 的取值范围,方法一就不可行。

    (方法二):位运算,简单,高效

//找规律
//3^3=0
//5^5=0
//3^5^5=3
//3^5^3=5
//3^5=6
// 异或支持交换律

#include <stdio.h>
int main()
{
	int a = 8;
	int b = 9;
	int z;
	z = a ^ b;  //设置密码z
	b = z ^ b;  //b=a^b^b=a
	a = z ^ a; //a=a^b^a=b
	printf("a=%d b=%d\n", a, b);
	return 0;
}

四、共勉

    这篇文章就是我对位运算的理解,如果大家有什么问题可以在评论区说出来哦,我们共同进步,一起加油!!!

按位与,按位或,按位异或,C语言超详细解析,c++,数据结构

 文章来源地址https://www.toymoban.com/news/detail-778556.html

到了这里,关于位运算:按位与、按位或、按位异或、按位左移、按位右移的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言:位运算符----与(&),或(|),非(~),异或(^),左移(<<)和右移(>>)

    C语言 基础开发----目录 位运算符 就是按二进制位进行运算。 C语言中位运算符主要包括六种,具体如下: 与(),或(|),非(~),异或(^),左移()和右移() 位运算符 含义 说明 按位 与 有0为0,双1为1: 11=1,10=0,01=0,00=0 只有两者对应位都为 1 ,结果对应位才为 1 ,否则为 0 I 按

    2024年01月18日
    浏览(51)
  • C#的几种位操作运算,与、或、非、异或、左移、右移

    C#的常见几种位操作运算,与($)、或(|)、非(~)、异或(^)、左移()、右移() 位操作一般来说比加减乘除计算要快一些 与()操作符的位都为1时,才为1,其他都为0,因此与()操作符的结果范围在[0, Math.Min(x,y)],x,y均为正整数 或(|)操作符的位都为0时,才为0,其他都为1,因此或(|)操作

    2024年02月16日
    浏览(37)
  • 【教3妹学编程-算法题】检查按位或是否存在尾随零

    3妹 :呜呜,烦死了, 脸上长了一个痘 2哥 : 不要在意这些细节嘛,不用管它,过两天自然不就好了。 3妹 :切,你不懂,影响这两天的心情哇。 2哥 : 我看你是不急着找工作了啊, 工作那么辛苦,哪还有时间想这些啊。 3妹 :说到找工作,我又要去刷题了。 2哥 :我给你出

    2024年01月20日
    浏览(49)
  • 【ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或)】

    上篇文章:ARM 常见汇编指令学习 5 – arm64汇编指令 wzr 和 xzr 下篇文章:ARM 常见汇编指令学习 7 - LDR 指令与LDR伪指令及 mov指令 BIC 指令 指令格式 根据operand哪个位为1,清除Rn对应的位,然后将结果存入Rd。 使用例子 : 第1条汇编代码表示将 r0 寄存器的 bit13 清0,其它bit不变。

    2024年02月13日
    浏览(71)
  • OpenCV——图像按位运算

    OpenCV——图像按位运算由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。   OpenCV4 针对两个图像之间的“与”、“或”、“异或”、以及“非”运算分别提供了 bitwise_and() 、 bitwise_or() 、 bitwise_xor() 、 bitwise_not() 函数。图

    2024年02月01日
    浏览(41)
  • opencv -12 图像运算之按 《位或》 运算(图像融合&图像修复和去除)

    或运算的规则是,当参与或运算的两个逻辑值中有一个为真时,结果就为真。其逻辑关系可以类比为如图 所示的并联电路,两个开关中只要有任意一个闭合时,灯就会亮。 3-5 对参与或运算的算子的不同情况进行了说明,表中使用“or”表示或运算。 按位或运算是指将数值转

    2024年02月16日
    浏览(58)
  • Verilog HDL按位逻辑运算符及逻辑运算符

    单目按位与运算符 ,运算符后为需要进行逻辑运算的信号,表示对信号进行每位之间相与的操作。例如: reg [3:0] A,C ; assign C = A ; 上面代码等价于 C = A[3] A[2] A[1] A[0] ; 如果A = 4’b0110,C的结果为0 单目按位或运算符 | ,运算符后为需要进行逻辑运算的信号,表示对信号进行每位

    2024年02月16日
    浏览(34)
  • 第7天----【位运算进阶之----位或(|)】七夕特别版

    ❤️ 今天我们来学习位或 注意:本文中的位是 从右往左 来说的,也就是从低位开始数的!!! 当然,在正式学习之前,让我们先看看昨天留下的问题:⭐️如何判断一个数是不是2的幂❓ ✨要想解决这个问题,我们先要搞清楚,2的幂有什么特征? 2的幂 十进制表达 二进制

    2024年02月11日
    浏览(56)
  • opencv -11 图像运算之按位逻辑运算(图像融合&图像修复和去除)

    按位逻辑运算是一种对图像进行像素级别的逻辑操作的方法,使用OpenCV的按位逻辑运算函数可以对图像进行位与(AND)、位或(OR)、位非(NOT)和位异或(XOR)等操作。 通俗点就是将像素点的十进制值转成二进制 来运算 以下是一些常见的按位逻辑运算的应用场景: 图像融

    2024年02月17日
    浏览(45)
  • 双重按位非运算符 ~~ 对数字取整

    介绍 按位非运算符( ~ )将操作数的位反转。 它将操作数转化为 32 位的有符号整型 。也就是可以对数字进行取整操作(保留整数部分,舍弃小数部分)。 并且按位非运算时,任何数字  x (已被转化为 32 位有符号整型) 的运算结果都是  -(x + 1) 。 那么双重按位非( ~~ )

    2024年02月19日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包