C语言之位运算
位运算
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语言之位运算的更多相关文章
- 【C语言】位运算
编写一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位0).函数调用形式为getbits(value,n1,2).----简单题目遇到想不到的问题 c语言位运算经典问题: ...
- C语言:位运算
所谓位运算,就是对一个比特(Bit)位进行操作.在<数据在内存中的存储>一节中讲到,比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了.C语言 ...
- C语言的位运算
位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2;x = x * 64;//改为:x = x << 1; // 2 ...
- C语言的位运算的优势
位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2;x = x * 64;//改为:x = x << 1; // 2 ...
- 关于c语言的位运算&,|,^(看懂汉字的都能看懂)
其中|,&可以当作逻辑运算符,当|,&当成逻辑运算符时,与||,&&的用法基本相似,&&,||运算时会当前面的表达式能够决定整个表达式,则不进行对后面的 ...
- C语言的位运算的优势 !
位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2; x = x * 64; //改为: x = x << 1; / ...
- 零基础逆向工程15_C语言09_位运算
1.汇编中的移位指令 算数移位指令 指令格式:SAL/SAR Reg/Mem, CL/Imm SAL(Shift Arithmetic Left):算数左移 SAR(Shift Arithmetic ...
- C语言中位运算异或“∧”的作用
1.概念异或运算符"∧"也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即 0∧0=0,0∧1=1, 1^0=1,1∧1=0.运算 ...
- C语言:位运算加密
数据加密解密是一个常用的功能,如果你不希望让别人看到文件中的内容,可以通过密钥(也称"密码")将文件的内容加密.比如文本文件(.txt),加密前的内容是能够读懂的,加密后的内容是& ...
随机推荐
- Web Service单元测试工具实例介绍之SoapUI
原文 Web Service单元测试工具实例介绍之SoapUI SoapUI是当前比较简单实用的开源Web Service测试工具,提供桌面应用程序和IDE插件程序两种使用方式.能够快速构建项目和组 ...
- 激活windows server 2012 R2的方法
首先登陆dreamspark 注册一个账号https://www.dreamspark.com/Account/SignIn.aspx, 点击创建账户,信息可以完全瞎编,邮箱不存在也可以.然后使用“我 ...
- android的版本控制
在一个团队项目中,项目的版本控制,一方面促进团队的协同能力,另一方面提高项目的进度 即使一个人的项目也最好使用SVN这样的版本控制,可以清楚的知道自己的修改的代码,和项目进度等.合理的托管,也让优秀的 ...
- Android开源框架Volley(Google IO 2013)源代码及内部实现分析
1.Volley概述 在项目开发过 程中,博主曾写过大量的访问网络重复代码,特别是ListView adapter很难避免getView()方法不被重复调用,如果ImageView不利用缓存机制,那么 ...
- 一步一步实现基于Task的Promise库(四)无参数的WorkItem
接着上一篇我直接给出代码,现在支持了new Task(), then(), all(), any() 这些不传参的调用方式. (function(){ var isFunction = functio ...
- ASP.NET MVC5 视图预编译
ASP.NET MVC5 视图预编译 ASP.NET MVC5 视图预编译 关于Razor视图及引擎原理,就不多说了. 这里通俗或者不恰当地说,cshtml视图文件是先编译成dll文件,再通过视图 ...
- “String.h” 源代码总结
<String.h> 总结: 常用的函数: 一.memchr: 说明:当第一次遇到字符ch时停止查找.如果成功,返回指向字符ch的指针:否则返回NULL. 代码: #include ...
- Dynamics CRM JS的调试的弊端解决办法
说道CRMJS的调试的博客,之前已经有人写过.很简单,和平常网站JS的调试过程大致相同. 但是Dynamics 中JS调试最麻烦的莫过于出错之后需要修改代码了.因为随着JS代码的修改,伴随着需要保存和 ...
- vijos1009:扩展欧几里得算法
1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...
- C/C++基础知识总结——C++简单程序设计
1. sizeof 1.1 sizeof(类型名) 1.2 sizeof 表达式 1.3 返回所占字节大小 2. I/O流的输出格式 2.1 常用I/O流库操纵符 dec 十进制 he ...