Leetcode C++位运算(整型 字符型)详解及其应用 判断奇偶、符号变换、绝对值、相反数、数据交换、高低位互换、幂次判断

本文详细介绍了C++中的位运算,包括原码、反码、补码的概念,位运算原理及在判断奇偶、符号变换、绝对值计算等方面的应用。通过位运算可以实现数据交换、高低位互换以及检测是否为2的幂次等操作。位运算在计算机中使用补码进行,对于正负数移位规则一致。文章还提供了位运算在实际问题中的巧妙运用实例。
摘要由CSDN通过智能技术生成

位运算使用的数据类型是整型和字符型
注意单个字符也能进行异或运算 本质也是ASCII二进制码的异或
异或结果的最终解释要看结果变量的类型
不仅整型之间、字符型可以异或 整型和字符串型之间也可以异或

在这里插入图片描述

一、原码 反码 补码

正数的原码,反码,补码,移码都等于原码
负数的反码=原码取反 (符号不变)
负数的补码=反码+1
负数的移码=补码的符号位取反

二、位运算原理

对转换成二进制的数字进行每一位上的0、1的运算,:
与(&),或(|),异或(^),左移(<<),右移(>>)

在计算机组成原理中移位运算如下(无符号数左右逻辑移都是补充0

在这里插入图片描述

但是计算机中都是用补码进行运算的 有符号数(算术移位):
正数 不管左移右移都是补0(左移末尾补0 右移高位补和符号位 即0)
负数 左0右1(左移末尾补0 右移高位补和符号位 即1)
按照移动规则括号里面的叙述 那么有符号数不管正数负数的移动规则都是一样的 左移末尾补0 右移高位补和符号位 因此在写代码时并不影响代码的实现

m>>n m 右移n位
m<<n m 左移n位
有符号数移位运算等价于2的幂次乘除法运算

无符号数:左移右移都是补0(逻辑移位)

如在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,若要求将一个无符号数的二进制位反转后输出,输入和输出都将被指定为有符号整数类型,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的,只是最后编译器会根据声明的变量是有股好还是无符号去解释数据为十进制输出给人看,十进制的结果的解释最终是由于编译器去做这件事的,见leetcode例题无符号数的二进制位反转后输出的几种方法

位运算的规律:
1.进行位运算时都是用数据的补码进行运算。
2.运算后得到的结果也是补码,需要将它转换成原码才能得到结果。

其实不光位运算计算机中所有运算都遵循补码运算 结果为负要减1求反这个规则
如果运算后得到的二进制串是一个正数(最高位为0)可以不转因为正数的补码和原码相同;如果为负数 减1再求反

#include <iostream>
void main()
{
   
 	//-----------正数按位运算-----------
	//按位右移  >> 往右移一位 
	//0000 0000 0000 1010
	//0 0000 0000 0000 101
	short sValue1 = 10 >> 1;
	printf("sValue1=%d\n", sValue1);  //5
 
	//按位左移  << 往左移一位 
	//0000 0000 0000 1010
	//000 0000 0000 1010 0
	short sValue2 = 10 << 1;
	printf("sValue2=%d\n", sValue2); //20

	//按位或 |
	//0000 0000 0000 1111
	//0000 0000 0000 1010
	//0000 0000 0000 1111
	short sValue3 = 15 | 10;
	printf("sValue3=%d\n", sValue3);//15
	
	//按位与 & 
	//0000 0000 0000 1111
	//0000 0000 0000 1010
	//0000 0000 0000 1010
	short sValue4 = 15 & 10;
	printf("sValue4=%d\n", sValue4); //10
	
	//按位异或  ^ 
	//0000 0000 0000 1111
	//0000 0000 0000 1010
	//0000 0000 0000 0101
	short sValue5 = 15 ^ 10;
	printf("sValue5=%d\n", sValue5);//5
	
	//按位非 ~  
	//0000 0000 0000 1010          
	//1111 1111 1111 0101(结果为负数 且是计算机中是补码表示)
	//需要补码转原码
	//->1111 1111 1111 0100(减1得反码)->1000 0000 0000 1011(求反得原码)
	short sValue6 = ~10;
	printf("sValue6=%d\n", sValue6);//11
 
    
 
	//-----------负数安位运算-----------//
	//负数用补码来运算
 
	//按位或  |  
	//1000 0000 0000 1111(-15原码)
	//->1111 1111 1111 0000(反码)
	//->1111 1111 1111 0001(补码)
	
	//1111 1111 1111 0001
	//0000 0000 0000 1010          
	//1111 1111 1111 1011(补码)
	//结果为负的补码 减1求再求反
	//->1111 1111 1111 1010(反码)->1000 0000 0000 0101(原码)
	short sValue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值