c语言移位操作
应该先看看C语言是指所有的位二进制算术位计算。即使输入的是十进制的数,在存储器存储为二进制形式。
“<<”使用方法:
的格式是:a<<m,a和m式,要求m>=0。
功能:将整型数a按二进制位向左移动m位,高位移出后,低位补0。
“>>”使用方法:
格式是:a>>m,a和m必须是整型表达式。要求m>=0。 功能:将整型数a按二进制位向右移动m位,低位移出后,高位补0
C语言中的移位操作。内容不多。只是有些地方你不注意,就疏忽了。
闲话少说,先做两个小题先。
(1)unsigned char x=3;
x<<1是多少?x>>1是多少?
(2)char x=3;
x<<1是多少?x>>1是多少?
(3)char x=-3;
x<<1是多少?x>>1是多少? 3写成二进制数是00000011。-3写成二进制数是(补码)11111101。
程序运行的时候。操作的是数值的编码表示。也就是数值在内存中的二进制表示。比方说,
程序取-3的时候,就去取11111101。 (1)对无符号数3来说。x<<1往左移一位,最左边的位移掉了。最右边的移进来的位补零。变成
00000110,所以结果是6。x>>1往右边移一位。因为是无符号数,所以逻辑右移,最右边一位移掉,
最左边移进来的位补零。变成00000001,所以结果是1。 (2)对于有符号数3来说,x<<1往左移一位。最左边的位移掉了,最右边的移进来的位补零。变成
00000110,所以结果是6。x>>1往右边移一位,因为是有符号数,可能发生逻辑右移,也可能发生算术右移
,这一点。C标准并没有明白地指定是使用逻辑右移还是算术右移。 但大多数的机器都使用算术右移,变成
00000001,所以结果还是1。 可是请注意,这仅仅是说大多数的机器是这种,你敢保证自己
不会碰到特殊情况吗?
(3)对于有符号数-3来说。x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。 变成
11111010,结果是-6。 往右移一位,因为是有符号数。可能发生逻辑右移,也可能发生算术右移。
大多数机器使用算术右移。变成11111110,结果是-2。 总结:左移时总是移位和补零。右移时无符号数是移位和补零,此时称为逻辑右移;
而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。 附打印内存中字节编码的代码:
void print_char(char x)
{
unsigned char * bp=(unsigned char *)&x;
int size=sizeof(x);
for(int i=0; i<size; i++)
printf("%.2x", bp[i]);
printf("/n");
}
这种做法可以自己练习。 从报价:http://blog.chinaunix.net/u1/33888/showart_334911.html
c语言移位操作的更多相关文章
- C语言之移位操作
C语言很多操作都是以字节为单位进行的,但有时为了节约空间,很多系统程序中要求在比特位级别进行运算处理.C语言一同提供了六种位运算的运算符,分别为&(按位与),|(按位或),~(按位取反),^( ...
- C语言中 移位操作运算
移位规律: 左移时总是移位和补零.右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位后补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移.(其实跟扩展逻辑一样 ...
- C语言零移位操作
给定一个整形数组要求把其中的零元素移动到数组的末尾 非零元顺序保持不变 以下采用两种方法实现 #include <stdlib.h> #include <stdio.h> #i ...
- c语言中的位移位操作
先要了解一下C语言里所有的位运算都是指二进制数的位运算.即使输入的是十进制的数,在内存中也是存储为二进制形式. “<<”用法: 格式是:a<<m,a和m必须是整型表达式,要求m ...
- C语言的数据类型
复习之余,做点笔记<C语言之数据类型> 一.整数数据类型 (1)整数数据类型 整数类型 char 字符型变量 1字节(8Bit) short 短整型 2字节(16Bit) i ...
- C语言 位操作
c语言位操作中需要注意有: 位操作只针对整型和字符型数据 在右移操作中:对无符号数和有符号中的正数补 0:符号数中的负数,取决于所使用的系统:补 0 的称为“逻辑右移”,补 1 的称为“算术右移”. ...
- 【转载】c语言数据的左移右移
原文地址:http://www.cnblogs.com/myblesh/articles/2431806.html 由于在飞控程序中执行效率对程序的影响相当大,所以一个好的运算效率很重要.左移右移比单 ...
- c语言优化
虽然对于优化C代码有很多有效的指导方针,但是对于彻底地了解编译器和你工作的机器依然无法取代,通常,加快程序的速度也会加大代码量.这些增加的代码也会影响一个程序的复杂度和可读性,这是不可接受的,比如你在 ...
- DES加密算法—实现(C语言)
http://www.iteye.com/topic/478024 DES(Data Encrypt Standard数据库加密标准)是迄今为止使用最广泛的加密体制. 初学信息安全的新生,一般都会被老 ...
随机推荐
- Windows环境下访问NFS(33篇Storage的文章)
Windows环境下访问NFS 使用Solaris时,如果想在两台Solaris之间共享数据,那么你想到的最省事.最方便的方法肯定是nfs.但是现在的学生们的桌面,估计99%以上都是Windows,W ...
- jquery ajax验证用户名是否存在(后台spring mvc)
controller层 @ResponseBody @RequestMapping(value = "/user/isExist", produces = "applic ...
- 【虚拟化实战】容灾设计之三Stretched Cluster
作者:范军 (Frank Fan) 新浪微博:@frankfan7 Stretched Cluster是一把双刃剑,会用的如行云流水,用不好反而受其限制. 传统的vSphere Cluster是指一个 ...
- POJ 1862 & ZOJ 1543 Stripies(贪心 | 优先队列)
题目链接: PKU:http://poj.org/problem?id=1862 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...
- 利用WinDbg找出程序崩溃的代码行号
之前碰到论坛里有几个好友,说程序不时的崩溃,什么xxoo不能read的! 如果光要是这个内存地址,估计你会疯掉~~ 所以分享一下基本的调试技巧,需要准备的工具有WinDbg + VC6.0, 下面是自 ...
- JSCapture实现屏幕捕捉
JSCapture 是用纯 JavaScript 和 HTML5 实现的屏幕捕捉库. 能够随意在浏览器或者桌面视频进行截图, JSCapture 使用 getUserMedia 来实现屏幕捕获. 当前 ...
- [Android学习笔记]View的draw过程学习
View从创建到显示到屏幕需要经历几个过程: measure -> layout -> draw measure过程:计算view所占屏幕大小layout过程:设置view在屏幕的位置dr ...
- dsp下基于双循环缓冲队列的视频采集和显示记录
对最近在设计的视频采集和显示缓冲机制做一个记录,以便以后使用. 视频采集和显示缓冲机制,其实是参考了Linux下v4L2的驱动机制,其采用输入多缓冲frame,输出多缓冲的切换机制.简单的就是ping ...
- Java Swing界面编程(28)---复选框:JCheckBox
程序能够通过JRadioButton实现单选button的功能,那么要实现复选框的功能,则必须使用JCheckBox完毕. package com.beyole.util; import java.a ...
- 黑马程序员:Java基础总结----类加载器
黑马程序员:Java基础总结 类加载器 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...