C++学习笔记(一) 位运算详解

本文是C++学习笔记的第一部分,重点介绍了位运算。详细讲解了计算机中符号数的四种表示方法——原码、反码、补码和移码,并明确了正负数在这些表示形式下的变化规则。接着,探讨了C++的位运算符,包括按位左移、按位右移、按位或、按位与、按位异或和按位非。总结了位运算的两大关键规律:使用补码进行运算以及运算结果需转换为原码。

  C++学习笔记(一)   位运算详解

  计算机中的符号数有四种表示方法,即原码,反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同


         原码    反码(存放负数)   补码(用于负数运算)   移码(用于存放负数小数)


   正数的原码,反码,补码,移码都是原码

   负数的反码=原码取反  (符号不变)  负数的补码=反码+1  负数的移码=补码的符号位取反


   位运算

  C++位运算有按位左移 << ,按位右移 >> ,按位或 | ,按位与 & ,按位异或 ^ ,按位非 ~ 。

#include <iostream>

void main()
{


	//-----------正数安位运算-----------
	//按位右移  >> 往右移一位  最高位补上和符号位相同的数
	//0000 0000 0000 1010
	//0 0000 0000 0000 101
	short sValue1 = 10 >> 1;
	printf("sValue1=%d\n", sValue1);

	//按位左移  << 往左移一位  最末位补0
	//0000 0000 0000 1010
	//000 0000 0000 1010
	short sValue2 = 10 << 1;
	printf("sValue2=%d\n", sValue2);

//

	//按位或  |  同位或运算   或运算 有1得1 无1得0
	//0000 0000 0000 1111
	//0000 0000 0000 1010
	//0000 0000 0000 1111
	short sValue3 = 15 | 10;
	printf("sValue3=%d\n", sValue3);

	//按位与 &   同位与运算   与运算 有0得0 无0得1
	//0000 0000 0000 1111
	//0000 0000 0000 1010
	//0000 0000 0000 1010
	short sValue4 = 15 & 10;
	printf("sValue4=%d\n", sValue4);

	//按位异或  ^ 同位异或运算   相同为0  不同为1
	//0000 0000 0000 1111
	//0000 0000 0000 1010
	//0000 0000 0000 0101
	short sValue5 = 15 ^ 10;
	printf("sValue5=%d\n", sValue5);

	//按位非 ~  
	//0000 0000 0000 1010          
	//1111 1111 1111 0101(补码)->1111 1111 1111 0100(反码)->1000 0000 0000 1011(原码)=11
	short sValue6 = ~10;
	printf("sValue6=%d\n", sValue6);

    

	//-----------负数安位运算-----------//
	//负数用补码来运算

	//按位或  |  同位或运算   或运算 有1得1 无1得0
	//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(补码)->1111 1111 1111 1010(反码)->1000 0000 0000 0101(原码)=-5
	short sValue7 = -15 | 10;
	printf("sValue7=%d\n", sValue7);

	//按位与 &   同位与运算   与运算 有0得0 无0得1
	//1000 0000 0000 1111(-15原码)->1111 1111 1111 0000(反码)->1111 1111 1111 0001(补码)
	//1111 1111 1111 0001
	//0000 0000 0001 0100
	//0000 0000 0001 0000(补码)=16
	short sValue8 = -15 & 20;
	printf("sValue8=%d\n", sValue8);

	//按位异或  ^ 同位异或运算   相同为0  不同为1
	//1000 0000 0000 1111(-15原码)->1111 1111 1111 0000(反码)->1111 1111 1111 0001(补码)
	//1111 1111 1111 0001
	//0000 0000 0001 0100                   
	//1111 1111 1110 0101(补码)->1111 1111 1110 0100(反码)->1000 0000 0001 1011(原码)=-27
	short sValue9 = -15 ^ 20;
	printf("sValue8=%d\n", sValue9);

	//按位非 ~  
	//1000 0000 0000 1111 (原码)-> 1111 1111 1111 0000 (反码)->1111 1111 1111 0001 (补码)         
	//1111 1111 1111 0001
	//0000 0000 0000 1110  = 14
	short sValue10 = ~-15;
	printf("sValue10=%d\n", sValue10);

	//按位右移  >> 往右移一位  最高位补上和符号位相同的数
	//1000 0000 0000 1010  (原码)->  1111 1111 1111 0101(反码)->1111 1111 1111 0110  (补码) 
	//1111 1111 1111 0110
	//1 1111 1111 1111 011(补码)->1111 1111 1111 1010 (反码)->  1000 0000 0000 0101 (原码) =-5
	short sValue11 = 10 >> 1;
	printf("sValue11=%d\n", sValue11);
	
	//按位左移  << 往左移一位  最末位补0
	//1000 0000 0000 1010  (原码)->  1111 1111 1111 0101(反码)->1111 1111 1111 0110  (补码) 
	//1111 1111 1111 0110
	//111 1111 1111 0110 0 (补码)->1111 1111 1110 1011   (反码)->   1000 0000 0001 0100(原码)=-20
	short sValue12 = -10 << 1;
	printf("sValue12=%d\n", sValue12);

	system("pause");
}


	  

  上面运行的结果为:





 总结位运算的规律:

  1.进行位运算时都是用数据的补码进行运算。

  2.运算后得到的结果也是补码,需要将它转换成原码才能得到结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值