C语言位操作初步
位操作允许程序员对单独的位进行操作,例如,早某些机器上,短整型占16位,位操作将每一位单独操作。
位操作允许程序员设置、清除、测试与其他的操作,这些操作如下表:
操作 | 含义 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
这些操作用于整型或者字符型
1、按位与(&)
Bit1 | Bit2 | Bit1 & Bit2 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
通常我们可把按位“与”操作 & 作为关闭某位(即将该位置0)的手段,例如我们想要关闭a数中的第3位,而又不影响其它位的现状,可以用一个数0xF7,即二进制数1111 0111去与a数作按位“与”运算:
0x88 1000 1000 a数
& 0xF7 1111 0111 屏蔽数
= 1000 0000
注意,这个数除第3位为0外,其它各位均为1,操作的结果只会将a数中的第3位置0,而a数的其它位不受影响。也就是说,若需要某个数的第n位关闭,只需要将该数与另一个数按位相与,另一个数除了相应的第n位为0外,其它各位都为1,以起到对其它各位的屏蔽作用。
应用举例:判断一个数字的奇偶性
由于在二进制下,当最后一个数字为0,则此数字为偶数,若为1则此数为奇数
代码如下:
int even(const int value)
{
return ((value & 1)==0);
}
2、按位或(|)
Bit1 | Bit2 | Bit1 | Bit2 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
通常我们可把按位“或”操作 | 作为置位(即将该位置1)的手段,例如我们想要将a数中的第0位和1位置1,而又不影响其它位的现状,可以用一个数0x03,即二进制数00000011去与a数作按位“或”运算:
0x88 1000 1000 a数
| 0x03 0000 0011 屏蔽数
= 1000 1011
注意,这个数除第0、1位为1外,其它各位均为0,操作的结果只会将a数中的第0、1位置1,而a数的其它位不受影响。也就是说,若需要某个数的第n位置1,只需要将该数与另一个数按位相“或”,另一个数除了相应的第n位为1外,其它各位都为0,以起到对其它各位的屏蔽作用。
3、按位异或(^)
Bit1 | Bit2 | Bit1 ^ Bit2 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
按位“异或”运算 ^ 具有一些特殊的应用,介绍如下:
① 按位“异或”运算可以使特定的位取反
例如:我们想让a数中的最低位和最高位取反,只要用0x81,即二进制数10000001去与它作按位“异或”运算,其运算结果同上式。经过操作后,最高位的值已经由1变0,而最低位的值也已经由0变1,起到了使这两位翻转的效果。其它位的状态保持不变。
可以看到,这个数除最低位、最高位为1外,其它各位均为0,操作的结果只会将a数中的第0、7位取反,而a数的其它位不受影响。也就是说,若需要某个数的第n位取反,只需要将该数与另一个数按位相“异或”,另一个数除了相应的第n位为1外,其它各位都为0,以起到对其它各位的屏蔽作用。上面的运算可以用a = a ^ (0x81) 来表示,也可以用a ^ =(0x81) 来表达。
② 直接交换两个变量的值
例如,若有变量a = 3,b = 4,想要交换它们的值,可以做如下一组操作:
a ^ = b
b ^ = a
a ^ = b
首先,a ^ = b:
a 0000 0011
^ b 0000 0100
a = 0000 0111
其次,b ^ = a:
b 0000 0100
^ a 0000 0111
b = 0000 0011
最后,a ^ = b:
a 0000 0111
^ b 0000 0011
a = 0000 0100
这样,a、b两个变量中的值就进行了对调。
4、按位取非(~)
Bit | ~Bit |
0 | 1 |
1 | 0 |
5、左移操作(<<)与右移操作(>>)
对于x,x<<n相当于x^n,x>>n相当于x/(2^n)
6、右移操作详解:
右移操作相当的诡异,当一个变量进行右移操作,C语言需要填充左边空的比特位
然而对于有符号变量,C使用符号位,如下表:
signed char | signed char | unsigned char | |
表达式 | 9>>2 | -8>>2 | 248>>2 |
Binary Value>>2 | 0000 1010>>2 | 1111 1000>>2 | 1111 1000>>2 |
结果 | ??00 0010 | ??11 1110 | ??11 1110 |
填充 | Sign Bit(0) | Sign Bit(1) | 0 |
最终结果(二进制) | 0000 0010 | 1111 1110 | 0011 1110 |
最终结果(短整型) | 2 | -2 | 62 |
C语言位操作初步的更多相关文章
- C语言 位操作
c语言位操作中需要注意有: 位操作只针对整型和字符型数据 在右移操作中:对无符号数和有符号中的正数补 0:符号数中的负数,取决于所使用的系统:补 0 的称为“逻辑右移”,补 1 的称为“算术右移”. ...
- 关于SQL语言的初步认识
关于SQL语言的初步认识 1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义. 2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项. 3.一个表或者是一 ...
- 原码、反码、补码及位操作符,C语言位操作
计算机中的所有数据均是以二进制形式存储和处理的.所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快. 1.原码.反码和补码 位(bit) 是计算机中处理数据的最小单 ...
- 嵌入式、C语言位操作的一些技巧汇总
下面分享关于位操作的一些笔记: 一.位操作简单介绍 首先,以下是按位运算符: 在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值, ...
- C语言位操作的算法
1.头文件 #ifndef _INC_BITOPERATION #define _INC_BITOPERATION #endif /* 封装了所有的位操作运算 */ #include<stdio ...
- C语言位操作(转)
http://www.cnblogs.com/cpoint/category/524132.html
- C语言位操作
#include <stdio.h> void print(int); int main(void) { int flag = 0xffe4; print(flag); printf(&q ...
- C语言_初步了解一下指针
指针的基本概念 在计算机中,所有的数据都是存放在存储器中的. 一般把存储器中的一个字节称为一个内存单元, 不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等.为了正确地访问这 ...
- C语言位操作--逻辑运算符组合
假设读者熟悉普通代数与布尔代数,下面是部分常见的涉及到加法.减法与逻辑运算符的组合: a. -x=~x+1 b. =~(x-1) c. ~x=-x-1 ...
随机推荐
- AJAX简单介绍
什么是AJAX Ajax 是 AsynchronousJavaScript and XML(以及 DHTML 等)的缩写. HTML 用于建立 Web表单并确定应用程序其它部分使用的字段. ·J ...
- css 手机适配
手淘H5移动端适配方案flexible源码分析 移动端适配一直是一个值得探讨的问题,在业余时间我找了一些页面,查看了一些厂商对于移动端H5页面的适配方案,看到了几个典型的例子,今天就来记录一下我看 ...
- Canvas控件之CanvasGroup
Canvas Group可以用来控制一组不需要个别控制的UI元素的某些方面,CanvasGroup的属性会影响他所有children的GameObject 其中有四个选项: -Alpha:这个选项很多 ...
- 用Python写简单的爬虫
准备: 1.扒网页,根据URL来获取网页信息 import urllib.parse import urllib.request response = urllib.request.urlopen(& ...
- android project 文件夹
android多国语言文件夹 http://www.blogjava.net/zhaojianhua/archive/2012/02/09/369676.html Android平板开发精确适配不同的 ...
- jquery.form 和MVC4做无刷新上传DEMO
jquery.form 和MVC4做无刷新上传DEMO HTML: <script src="~/Scripts/jquery-1.10.2.min.js"></ ...
- z-index 层级关系
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- vs2012更改默认开发环境
1.在菜单栏里找到“Tools”(工具),选择下面的“Import and Export Settings”(导入和导出设置),如图1所示: 图1 2.弹出如下界面,按提示选择你需要 ...
- CentOS 7 mini安装后安装图形界面及远程设置
安装图形界面 yum group install "GNOME Desktop" "Graphical Administration Tools" 安装 xrd ...
- create a cocos2d-x-3.0 project in Xcode
STEP1: Open Terminal SETP2: Run setup.py SETP3: Run source /Users/your_user/.bash_profile( so that e ...