位运算

1).定义.

指的是1个二进制数据的每一位来参与运算.

位运算的前提: 是这个数必须是1个二进制.

注意:

a). 参与位运算的二进制数据必须是补码形式.

b). 位运算的结果也是二进制的补码形式.

2).按位与: &

参与按位与的两个二进制数.如果都为1 那么结果就为1 只要有1位为0 那么结果就为0.

3 & 2;

第1步骤:先得到两个数的二进制补码形式.

3的补码: 00000000 00000000 00000000 00000011

2的补码: 00000000 00000000 00000000 00000010

-------------------------------------------------------

00000000 00000000 00000000 00000010   2

-3 & 4;

-3的原码:10000000 00000000 00000000 00000011

-3的反码:11111111 11111111 11111111 11111100

-3的补码:11111111 11111111 11111111 11111101

4的补码: 00000000 00000000 00000000 00000100

------------------------------------------------------

00000000 00000000 00000000 00000100

-3 & -4;

-4的原码: 10000000 00000000 00000000 00000100

-4的反码: 11111111 11111111 11111111 11111011

-3的补码:11111111 11111111 11111111 11111101

-4的补码:11111111 11111111 11111111 11111100

-----------------------------------------------------

11111111 11111111 11111111 11111100

结果是补码: 现将其还原为反码

反码:      11111111 11111111 11111111 11111011

原码:      10000000 00000000 00000000 00000100

注意:

任何数按位与1的结果是:是这个数的最低位.

10 & 1

xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx0

00000000 00000000 00000000 00000001

------------------------------------

00000000 00000000 00000000 00000000

偶数的最低位一定是0. 奇数的最低为一定是1

所以,如果要判断这个数是奇数还是偶数 只要用这个数按位与1就可以了.

如果结果为1 那么就是奇数 如果结果为0 那么结果就是偶数.

int num = 10;

if((num & 1) == 0)

{

偶数.

}

else

{

奇数.

}

3). 按位或. |

参与按位或的二进制数据 只要有1位是1 那么结果就为1  只有当两位都是0的时候结果才为0

3 | 2;

3的补码: 00000000 00000000 00000000 00000011

2的补码: 00000000 00000000 00000000 00000010

------------------------------------------------------

00000000 00000000 00000000 00000011

-3 | 4

-3的补码:11111111 11111111 11111111 11111101

4的补码: 00000000 00000000 00000000 00000100

------------------------------------------------------

11111111 11111111 11111111 11111101

结果是1个负数.

反码: 11111111 11111111 11111111 11111100

原码: 10000000 00000000 00000000 00000011

-3 | -4

-3的补码:11111111 11111111 11111111 11111101

-4的补码:11111111 11111111 11111111 11111100

-------------------------------------------------------

11111111 11111111 11111111 11111101

4). 按位取反: ~

单目运算符. 将这个二进制数的每一位取反.

~3;

3的补码: 00000000 00000000 00000000 00000011

11111111 11111111 11111111 11111100 补码

11111111 11111111 11111111 11111011 反码

10000000 00000000 00000000 00000100 原码

5). 按位异或: ^

参与按位异或的二进制数据的位 如果相同则为0 不同为1.

3 ^ 2;

00000000 00000000 00000000 00000011   3的补码

00000000 00000000 00000000 00000010   2的补码

--------------------------------------

00000000 00000000 00000000 00000001   1

交换两个变量的值可以用异或运算.

int a = 3;

int b = 2;

a = a ^ b;  a = 1

b = a ^ b;  b = 3

a = a ^ b;  b = 2

1 ^ 2

00000000 00000000 00000000 00000001

00000000 00000000 00000000 00000010

-------------------------------------------------------

00000000 00000000 00000000 00000011                      3

00000000 00000000 00000000 00000001

00000000 00000000 00000000 00000011

------------------------------------------------------

00000000 00000000 00000000 00000010                      2

6). 按位左移运算. <<

参与按位左移运算的二进制数据. 向左移动指定的位数. 低位不够补0 高位溢出就丢弃.

3 << 2;

00000000 00000000 00000000 00000011

000000 00000000 00000000 0000001100

12

注意:

a). 左移运算有可能会改变其正负性.

b). 将1个数左移n位,相当于将这个数 乘以 2的n次方.

3 << 2    3乘以2的2次方.

16 << 3;   16 * 8  128

5 * 16 = ????

5 << 4

7). 按位右移. >>

参与按位右移的二进制数据.向右移动指定的位数. 低位溢出丢弃,高位补符号位.

3 >> 2;

00000000 00000000 00000000 00000011

0000000000 00000000 00000000 000000

16 >> 2;

00000000 00000000 00000000 00010000

00000000 00000000 00000000 000100

-16 >> 3

10000000 00000000 00000000 00010000

11111111 11111111 11111111 11101111

11111111 11111111 11111111 11110000

11111111111 11111111 11111111 11110

11111111111 11111111 11111111 11101 反码

10000000000 00000000 00000000 00010

注意.

a). 右移运算不会改变正负性.

b). 1个数按位右移n位.相当于这个数除以2的n次方.

100 >> 2  相当于 100 / 4

C语言之位运算的更多相关文章

  1. 【C语言】位运算

    编写一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位0).函数调用形式为getbits(value,n1,2).----简单题目遇到想不到的问题 c语言位运算经典问题: ...

  2. C语言:位运算

    所谓位运算,就是对一个比特(Bit)位进行操作.在<数据在内存中的存储>一节中讲到,比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了.C语言 ...

  3. C语言的位运算

    位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2;x = x * 64;//改为:x = x << 1; // 2 ...

  4. C语言的位运算的优势

    位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2;x = x * 64;//改为:x = x << 1; // 2 ...

  5. 关于c语言的位运算&,|,^(看懂汉字的都能看懂)

    其中|,&可以当作逻辑运算符,当|,&当成逻辑运算符时,与||,&&的用法基本相似,&&,||运算时会当前面的表达式能够决定整个表达式,则不进行对后面的 ...

  6. C语言的位运算的优势 !

    位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2; x = x * 64; //改为: x = x << 1; / ...

  7. 零基础逆向工程15_C语言09_位运算

    1.汇编中的移位指令 算数移位指令 指令格式:SAL/SAR Reg/Mem, CL/Imm SAL(Shift Arithmetic Left):算数左移 SAR(Shift Arithmetic ...

  8. C语言中位运算异或“∧”的作用

    1.概念异或运算符"∧"也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即 0∧0=0,0∧1=1, 1^0=1,1∧1=0.运算    ...

  9. C语言:位运算加密

    数据加密解密是一个常用的功能,如果你不希望让别人看到文件中的内容,可以通过密钥(也称"密码")将文件的内容加密.比如文本文件(.txt),加密前的内容是能够读懂的,加密后的内容是& ...

随机推荐

  1. PHP 14:类的实例

    原文:PHP 14:类的实例 在本章中我们将介绍一个实例,来进一步对类加深了解.本章构建一个Page类,它代表了一个页面.其中有显示页面的title,样式,内容等函数.此页面的效果如下:我们将把这个页 ...

  2. C和Java中数组的定义

    在学习C和Java中,关于数组的定义两者不同,在初学的时候,容易产生混淆,现在将两者对比下. 1.初始化 在C语言中,关于一维数组的定义: 完全初始化  int a[5]={1,2,3,4,5},对于 ...

  3. C语言两个libxml2库使用的问题

    最近使用libxml2想做点东西,翻看一些example后还是有些疑问,去segmentfault问了下,感谢@pingjiang的热心解答,问题解决,记录如下 (一)如下是一个XML文件,p为根结点 ...

  4. JCronTab 定时调用

    习惯使用 unix/linux 的开发者应该对 crontab 都不陌生.Crontab 是一个很方便的用于 unix/linux 系统的任务调度命令.JCronTab 则是一款全然依照 cronta ...

  5. Repository在DDD中的应用

    Repository在DDD中的应用2014-10-09 08:55 by Jesse Liu, 98 阅读, 0 评论, 收藏, 编辑 概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值 ...

  6. 十款最佳Node.js MVC框架

    十款最佳Node.js MVC框架摘要:Node.js是JavaScript中最为流行的框架之一,易于创建可扩展的Web应用.本文分享十款最佳的JavaScript框架. Node.js是JavaSc ...

  7. 题目要求:建立一个类Str,将一个正整数转换成相应的字符串,例如整数3456转换为字符串"3456".

    题目要求:建立一个类Str,将一个正整数转换成相应的字符串,例如整数3456转换为字符串"3456". 关键:怎么将一个数字转换为字符? [cpp] view plaincopy ...

  8. 数据类型和typeof操作符

    虽然学习js有一段时间了,但是对js的基础语法却是有些生疏.最近在看jquery源码,决定随带总结一些基础的语法知识.今天总结一下数据类型和typeof,这在写js的时候,是不得不知道的知识. 数据类 ...

  9. maven 启蒙

    Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.为了替代ANT的Apache开源项目.现在的项目越来越大.ANT已经不适用了. 1.部署m ...

  10. [置顶] 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!

    前言 FineUI控件库发展至今已经有 5 个年头,目前论坛注册的QQ会员 5000 多人,捐赠用户 500 多人(捐赠用户转化率达到10%以上,在国内开源领域相信这是一个梦幻数字!也足以证明Fine ...