首页 > 其他分享 >位运算详细介绍

位运算详细介绍

时间:2024-06-09 17:04:06浏览次数:23  
标签:右移 运算 结果 二进制 介绍 详细 10101001 字节

1.定义: 

位运算是一种针对二进制数的操作,它直接操作二进制数的各个位,以达到高效的运算目的。位运算常用于计算机底层的操作,如编码解码、图像处理和密码学等领域。下面详细介绍几种常见的位运算及其应用。


位与(&):对两个操作数的每个对应位执行逻辑与操作,如果两个对应位都为1,则结果为1,否则为0。
例子:假设有两个二进制数10101001和11001100,进行位与运算后,结果为10001000。


位或(|):对两个操作数的每个对应位执行逻辑或操作,如果两个对应位中至少有一个为1,则结果为1,否则为0。
例子:假设有两个二进制数10101001和11001100,进行位或运算后,结果为11101101。


位异或(^):对两个操作数的每个对应位执行逻辑异或操作,如果两个对应位不相同,则结果为1,否则为0。
例子:假设有两个二进制数10101001和11001100,进行位异或运算后,结果为01100101。


位非(~):对操作数的每个位执行逻辑非操作,即对每个位取反。
例子:假设有一个二进制数10101001,进行位非运算后,结果为01010110。


左移(<<):将一个二进制数的各个位向左移动指定的位数,右侧空出的位用0填充。
例子:假设有一个二进制数10101001,进行左移2位运算后,结果为10100100。


右移(>>):将一个二进制数的各个位向右移动指定的位数,左侧空出的位用符号位填充(正数用0,负数用1)。
例子:假设有一个二进制数10101001,进行右移2位运算后,结果为11101010。

 

2.运用场景: 


判断奇偶性:通过位与运算和位移运算,可以判断一个整数是奇数还是偶数。如果一个整数的最后一位为1,则为奇数,否则为偶数。


交换两个变量的值:通过位异或运算,可以实现两个变量值的交换,而无需使用额外的中间变量。


判断一个数是否是2的幂次方:如果一个数n是2的幂次方,那么它的二进制表示中只有一个1,通过位与运算可以判断。


判断两个数是否异号:通过位异或运算,如果两个数的符号位不同,则结果为1,表示两个数异号。


去除一个整数的最后一位:通过右移运算,可以将一个整数的最后一位去除。


判断一个数的第n位是0还是1:通过右移运算和位与运算,可以得到一个数的任意一位的值。


以上只是位运算的一部分应用,位运算在计算机底层的操作中有着广泛的应用,能够高效地进行各种操作,提高程序的性能。

3.示例代码分析 

示例1:

for (int i=0; i<8; i++) {
            if(byte & 1) count++;
            byte >>= 1;
        }

 这段代码的作用是计算一个字节(byte)中为1的位数(即二进制表示中1的个数)。
首先,通过一个循环,从低位到高位逐个检查字节的每个位。循环的条件是i<8,即检查字节的8个位。
在循环中,使用位与运算(&)将字节的最低位与1进行比较。如果最低位为1,则位与运算的结果为1,否则为0。通过这个判断条件,可以判断字节的最低位是否为1。
如果最低位为1,则将计数器(count)加1,用于统计字节中为1的位数。
接下来,通过右移运算(>>)将字节向右移动1位,即将字节的次低位移动到最低位。这样,在下一次循环中,可以继续检查字节的下一个位。

循环结束后,计数器中的值即为字节中为1的位数。
这段代码可以用于统计一个字节中为1的位数,可以应用于各种场景,如计算机网络中的数据包处理、图像处理中的像素计数等。

问题:右移时,高位是否自动补零 

在这段代码中,默认情况下,byte是一个有符号整数(signed char, int8_t等),因此在右移运算时,高位会使用符号位进行补位。这意味着如果byte的最高位(符号位)为1,则右移后,高位将被填充为1;如果byte的最高位为0,则右移后,高位将被填充为0。

如果希望在右移时,高位补0,可以将byte声明为无符号整数(unsigned char, uint8_t等),这样右移操作将会在高位补0。

示例2: 

if (count & 1) { //偶校验
        pack[7] = 1;
    } else {
        pack[7] = 0;
    }

 在代码中,count & 1用于判断一个数的奇偶性。在二进制表示中,偶数的最低位(最右边的位)一定是0,而奇数的最低位一定是1。因此,当一个数与1进行按位与操作时,如果这个数是奇数,则结果为1;如果是偶数,则结果为0。

因此,通过count & 1可以方便地判断一个数是奇数还是偶数。

标签:右移,运算,结果,二进制,介绍,详细,10101001,字节
From: https://blog.csdn.net/qq_71286244/article/details/139463160

相关文章

  • STM32单片机开发入门(四) 示波器的介绍及使用方法
    文章目录一.概要二.探头补偿校准三.电压测量四.波形的测量与分析五.串口通讯波形测量解析六.触发捕捉瞬时信号七.小结一.概要示波器主要用于观察电信号的波形变化。在显示屏上,工程师可以直接看到电信号的全过程,从而进行定性和定量的分析。这种仪器通常用于显示电压......
  • 打败GPT-4的最强开源中文大模型GLM-4终于亮相了(附:超详细搭建过程)
    GLM-4是由智谱AI推出的新一代基座预处理大模型,具有与GPT-4相近的性能,尤其在中文能力上可以比肩GPT-4。它在多个方面进行了优化和提升,包括支持更长的上下文长度、更快的推理速度、降低推理成本,以及增强了智能体能力。GLM-4能够处理128k的上下文窗口长度,单次提示词可以处理的文......
  • Java中运算符的详细介绍
    在Java编程中,运算符是执行各种操作的符号。Java提供了丰富的运算符来处理不同类型的操作。本文将详细介绍Java中的各种运算符,包括算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三元运算符和类型运算符,并通过代码示例帮助理解这些运算符的使用方法。一、算术......
  • python-数据分析-Numpy-3、数组的运算
    数组的运算使用NumPy最为方便的是当需要对数组元素进行运算时,不用编写循环代码遍历每个元素,所有的运算都会自动的矢量化。简单的说就是,NumPy中的数学运算和数学函数会自动作用于数组中的每个成员。#-*-coding:utf-8-*-#数组的运算#使用NumPy最为方便的是当需要对数组......
  • 《手把手教你》系列练习篇之15-python+ selenium自动化测试 -番外篇 - 最后一波啊!!!(详细
    1.简介 本来上一篇就是练习篇的最后一篇文章了,但是有的小伙伴私下反映说是做了那么多练习,没有一个比较综合的demo练练手。因此宏哥在这里又补存了一些常见的知识点进行练习,在文章最后也通过实例给小伙伴们或者童鞋们进行了一个登录模块的自动化测试的实例,其他的你可以照......
  • 《手把手教你》系列练习篇之14-python+ selenium自动化测试 -压台篇(详细教程)
    1.简介 本文是练习篇的最后一篇文章,虽然练习篇的文章到此就要和大家说拜拜了,但是我们的学习之路才刚刚开始。不要停下你的脚步,大步朝前走吧!比你优秀的人还在走着,我们有什么理由停下自己的脚步了,生命不止,学习亦是如此。好了,宏哥的毒鸡汤好喝吧,喝够了就开始学习吧。......
  • [无监督学习] 14.详细图解k-means 算法
    k-means算法把相似的数据汇总为簇的方法叫作聚类。k-means算法是一种聚类算法,该算法非常简单,所以被广泛应用于数据分析。概述k-means算法是一种有代表性的聚类算法。由于该算法简单易懂,又可以用于比较大的数据集,所以在市场分析和计算机视觉等领域得到了广泛的应用。我......
  • C++20 新特性: 三向比较运算符
    目录标题功能和用法示例代码如何重载三向比较运算符示例:重载三向比较运算符注意事项结语C++20引入了一种新的比较运算符,称为“三向比较运算符”或“太空船运算符”,其符号为<=>。这个运算符提供了一种简化方式来同时比较两个值的相等性、小于和大于状态。这一特......
  • 超详解——python数字和运算——小白篇
    目录1.位运算2.常用内置函数/模块math模块:random模块:decimal模块:3.内置函数:总结:1.位运算位运算是对整数在内存中的二进制表示进行操作。Python支持以下常见的位运算符:按位与(&):两个二进制数对应位都为1时,结果的该位才为1。按位或(|):两个二进制数对应位有一个为1,结果......
  • pxe批量部署linux介绍
    1、PXE批量部署的作用及必要性: 1)智能实现操作系统的批量安装(无人值守安装) 2)减少管理员工作,提高工作效率 3)可以定制操作系统的安装流程 a.标准流程定制(ks.cfg) b.自定义流程定制(ks.cfg(%post))2、通过dhcp+tftp+nfs/http/ftp+kickstart(ks.cfg)+DNS1、客户......