C语言的移位运算符

C的移位位运算符。移位运算符向左或向右移动位。

1.左移:<<

左移运算符(<<)将其左侧运算对象每一位的值向左移动其右侧运算对象指定的位数。

左侧运算对象移出左末端位的值丢失,用0填充空出的位置.

下面例子中,每一位都向左移动两个位置:
    (10001010)  << 2  //表达式

(00101000)  << 2  //结果值

该操作产生了一个新的位值,但是不改变其运算对象。例如,假设stonk为1,那么stonk << 2为4,但是stonk本身不变,仍为1。

可以使用左移赋值运算符(<<=)来更改变量的值。

该运算符将变量中的位向左移动其右侧运算对象给定值的位数,如下例:

int stonk = 1;
int onkoo;
onkoo = stonk << 2;  /* 把4赋值给onkoo */
stonk <<= 2;  /* 把stonk的值改为4 */

2.右移:>>

右移运算符,将其左侧运算对象每一位的值向右移动其右侧运算对象指定的位数。

左侧运算对象移出右末端位的值丢失。

对于无符号类型,用零填充空出的位置;对于有符号类型,其结果取决于机器。

空出的位置可用0填充,或者用符号位(即最左端的位)的副本填充:

(10001010)>> 2    //表达式,有符号值

(00100010)           //在某些系统中的结果值

(10001010)>> 2    //表达式,有符号值

(11100010)           //在另一些系统上的结果值

下面是无符号值的例子:

(10001010)>> 2    //表达式,无符号值

(00100010)           //所有系统都得到该结果值

每个位向右移动两个位置,空出的位用0填充。

右移赋值运算符(>>=)其左侧的变量向右移动指定数量的位数,如下所示:

int sweet = 16;       //二进制值为:0001 0000
int ooosw;

ooosw = sweet >> 3;   // 右移三位2进制值W为:0000 0010, 十进制ooosw = 2,sweet的值仍然为16
sweet >>=3;           //sweet的值为2    ‘>>=’是右移赋值运算符

3.用法:移位运算符

移位运算符针对2的幂提供快速有效的乘法和除法:

number << n      num乘以2的n次幂

number >> n     如果number为非负,则用number除以2的n次幂

这些移位运算符,类似于在10进制中,移动小数点来乘以10或除以10。

移位预算符还可以用于较大单元中提取一些位。例如用一个unsigned long类型的值表示颜色值,低阶位字节存储红色的强度,下一个字节存储绿色的强度,第3个字节存储蓝色的强度。

随后你希望把每种颜色的强度分别存储在3个不同的类型的变量中,那么可以使用你下面的语句:

#define BYTE_MASK 0xff
unsigned long color = 0x002a162f;
unsigned char blue, green, red;
red = color & BYTE_MASK;
green = (color >> 8) & BYTE_MASK;
blue = (color >> 16) & BYTE_MASK;

以上代码中使用右移运算符,将8位颜色值移动至低阶字节,然后使用掩码技术把低阶字节赋值给指定的变量。



C语言的移位运算符

原文地址:https://www.cnblogs.com/LinQingYang/p/12447580.html

时间: 2024-08-30 06:21:55

C语言的移位运算符的相关文章

Java_C++_C# 移位运算符比较

Java语言的移位运算符 Java语言的移位运算符: <<, >>, >>>共3种. publicclass Test { publicstaticvoidmain(String[] args) { /* * 移位运算符只对byte,short,int,long和char类型有效 */ //有(无)符号数, 左移(<<),最高位符号位都将被右边的位覆盖 bytenum = (byte)0x8F; num<<= 1; System.out.p

Swift -- 语言指南--高级运算符

原文地址: http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和Objective-C中的位运算符和移位运算. 不同于C语言中的数值计算,Swift的数值计算默认是不可溢出的.溢出行为会被捕获并报告为错误.你是故意的?好吧,你可以使用Swift为你准备的另一套默认允许溢出的数值运算符,如可溢出加&+.所有允许溢出的运算符都是以&开始的. 自定义的结构,类和枚举,是否可

Java语言中的----运算符

day05 Java语言中的----运算符 一.运算符概述: 运算符的使用在每一门开发语言中都会使用到,在不同的语言中也会有不同的使用规则.通过运算符我们可以联想到MySQL数据库中的运算符,这些都是差不多的,可能有些在使用上是不一样的.下面就来看看Java中的运算符. 二.运算符: 1.算术运算符: 主要包含:加.减.乘.除.取余(%).自加(++).自减(--) 2.赋值运算符: 就是等号(=) 3.位运算符: 主要包含:&.|.~.^.<<.>>.>>&g

位移位运算符

  位移位运算符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数. 移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移花接木有关.如果是左移,则规定补入的数全部是0:如果是右移,还与被移位的数据是否带符号有关.若是不带符号数,则补入的数全部为0:若是带符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位).具体移位规则如下所示. 位移位运算符的优先级如

移位运算符(JAVA)

java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>     :     右移运算符,num >> 1,相当于num除以2 >>>    :     无符号右移,忽略符号位,空位都以0补齐 1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数.1)它的通用格式如下所示:value << numnum 指定要移位值value 移动的位数.左移的规则只

java移位运算符详解[转]

java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位,0补最低位 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模.如对int型移动33位,实际上只移动了332=1位. 2)运算规则 按

【ThinkingInC++】13、输出移位运算符的操作

头文件 /** * 功能:输出移位运算符的操作 * 时间:2014年8月12日20:01:32 * 作者:cutter_point */ #ifndef PRINTBINARY_H_INCLUDED #define PRINTBINARY_H_INCLUDED #include<iostream> using namespace std; void printBinary(const unsigned char val) { for(int i=7 ; i != -1 ; --i) { if(

java移位运算符详解

java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移).1.左移运算符左移运算符<<使指定值的所有位都左移规定的次数.1)它的通用格式如下所示:value << numnum 指定要移位值value 移动的位数.左移的规则只记住一点:丢弃最高位,0补最低位如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模.如对int型移动33位,实际上只移动了332=1位. 2)运算规则按二进制形式把所有的

c#移位运算符(&quot;&lt;&lt;&quot;及&quot;&gt;&gt;&quot;)详细说明

以前感觉移位运算符自己挺明白的,也许是学的时间长了,后来一看,忘得差不多了.现在参考一些网上的学习资料,将位移运算符整理一下,作为知识点总结,也算个积累.在讲移位运算符之前,先简单补充一下原码与补码的知识. 一.原码与补码 在计算机系统中,数值一律用补码来存储(表示).主要原因:使用补码,可以将符号位和其他位统一处理:同时减法也可按加法来处理.另外,两个补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃. 1.原码转补码分两种情况 (1)正数的补码:与原码相同(已知原码求补码) 例如: