当前位置:首页 » 编程语言 » c语言移位运算符使用的简单方法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言移位运算符使用的简单方法

发布时间: 2023-08-22 20:09:27

c语言中移位运算

右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:10100110 >>5(假设字长为8位),则得到的是 11111101。

总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.

所以,short a=0xf245,即a=1111001001000101,经过右移后,b=a>>8;b=1111111111110010,即b=0xfff2。注意是有符号右移为算术右移!!!

Ⅱ c语言位运算符的用法

c语言位运算符的用法1

c语言位运算符的用法如下:

一、位运算符C语言提供了六种位运算符:

& 按位与

| 按位或

^ 按位异或

~ 取反

<< 左移

>> 右移

1. 按位与运算

按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。

例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。

按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。

main(){

int a=9,b=5,c;

c=a&b;

printf("a=%d/nb=%d/nc=%d/n",a,b,c);

}

2. 按位或运算

按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

例如:9|5可写算式如下: 00001001|00000101

00001101 (十进制为13)可见9|5=13

main(){

int a=9,b=5,c;

c=a|b;

printf("a=%d/nb=%d/nc=%d/n",a,b,c);

}

3. 按位异或运算

按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)。

main(){

int a=9;

a=a^15;

printf("a=%d/n",a);

}

4. 求反运算

求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110。

5. 左移运算

左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。

6. 右移运算

右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的`各二进位全部右移若干位,“>>”右边的数指定移动的位数。

例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。

main(){

unsigned a,b;

printf("input a number: ");

scanf("%d",&a);

b=a>>5;

b=b&15;

printf("a=%d/tb=%d/n",a,b);

}

请再看一例!

main(){

char a='a',b='b';

int p,c,d;

p=a;

p=(p<<8)|b;

d=p&0xff;

c=(p&0xff00)>>8;

printf("a=%d/nb=%d/nc=%d/nd=%d/n",a,b,c,d);

}

c语言位运算符的用法2

C语言位运算。所谓位运算,就是对一个比特(Bit)位进行操作。比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了。

C语言提供了六种位运算符:

按位与运算(&)

一个比特(Bit)位只有 0 和 1 两个取值,只有参与&运算的两个位都为 1 时,结果才为 1,否则为 0。例如1&1为 1,0&0为 0,1&0也为 0,这和逻辑运算符&&非常类似。

C语言中不能直接使用二进制,&两边的操作数可以是十进制、八进制、十六进制,它们在内存中最终都是以二进制形式存储,&就是对这些内存中的二进制位进行运算。其他的位运算符也是相同的道理。

例如,9 & 5可以转换成如下的运算:

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)

& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)

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

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在内存中的存储)

也就是说,按位与运算会对参与运算的两个数的所有二进制位进行&运算,9 & 5的结果为 1。

又如,-9 & 5可以转换成如下的运算:

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)

& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)

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

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)

-9 & 5的结果是 5。

关于正数和负数在内存中的存储形式,我们已在教程《整数在内存中是如何存储的》中进行了讲解。

再强调一遍,&是根据内存中的二进制位进行运算的,而不是数据的二进制形式;其他位运算符也一样。以-9&5为例,-9 的在内存中的存储和 -9 的二进制形式截然不同:

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)

-0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (-9 的二进制形式,前面多余的 0 可以抹掉)

按位与运算通常用来对某些位清 0,或者保留某些位。例如要把 n 的高 16 位清 0 ,保留低 16 位,可以进行n & 0XFFFF运算(0XFFFF 在内存中的存储形式为 0000 0000 -- 0000 0000 -- 1111 1111 -- 1111 1111)。

【实例】对上面的分析进行检验。

00001. #include

00002.

00003. int main(){

00004. int n = 0X8FA6002D;

00005. printf("%d, %d, %X ", 9 & 5, -9 & 5, n & 0XFFFF);

00006. return 0;

00007. }

运行结果:

1, 5, 2D

按位或运算(|)

参与|运算的两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如1|1为1,0|0为0,1|0为1,这和逻辑运算中的||非常类似。

例如,9 | 5可以转换成如下的运算:

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)

| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)

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

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1101 (13 在内存中的存储)

9 | 5的结果为 13。

又如,-9 | 5可以转换成如下的运算:

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)

| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)

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

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)

-9 | 5的结果是 -9。

按位或运算可以用来将某些位置 1,或者保留某些位。例如要把 n 的高 16 位置 1,保留低 16 位,可以进行n | 0XFFFF0000运算(0XFFFF0000 在内存中的存储形式为 1111 1111 -- 1111 1111 -- 0000 0000 -- 0000 0000)。

【实例】对上面的分析进行校验。

00001. #include

00002.

00003. int main(){

00004. int n = 0X2D;

00005. printf("%d, %d, %X ", 9 | 5, -9 | 5, n | 0XFFFF0000);

00006. return 0;

00007. }

运行结果:

13, -9, FFFF002D

按位异或运算(^)

参与^运算两个二进制位不同时,结果为 1,相同时结果为 0。例如0^1为1,0^0为0,1^1为0。

例如,9 ^ 5可以转换成如下的运算:

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)

^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)

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

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1100 (12 在内存中的存储)

9 ^ 5的结果为 12。

又如,-9 ^ 5可以转换成如下的运算:

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)

^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)

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

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0010 (-14 在内存中的存储)

-9 ^ 5的结果是 -14。

按位异或运算可以用来将某些二进制位反转。例如要把 n 的高 16 位反转,保留低 16 位,可以进行n ^ 0XFFFF0000运算(0XFFFF0000 在内存中的存储形式为 1111 1111 -- 1111 1111 -- 0000 0000 -- 0000 0000)。

【实例】对上面的分析进行校验。

00001. #include

00002.

00003. int main(){

00004. unsigned n = 0X0A07002D;

00005. printf("%d, %d, %X ", 9 ^ 5, -9 ^ 5, n ^ 0XFFFF0000);

00006. return 0;

00007. }

运行结果:

12, -14, F5F8002D

取反运算(~)

取反运算符~为单目运算符,右结合性,作用是对参与运算的二进制位取反。例如~1为0,~0为1,这和逻辑运算中的!非常类似。。

例如,~9可以转换为如下的运算:

~ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)

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

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0110 (-10 在内存中的存储)

所以~9的结果为 -10。

例如,~-9可以转换为如下的运算:

~ 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)

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

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1000 (9 在内存中的存储)

所以~-9的结果为 8。

【实例】对上面的分析进行校验。

00001. #include

00002.

00003. int main(){

00004. printf("%d, %d ", ~9, ~-9 );

00005. return 0;

00006. }

运行结果:

-10, 8

左移运算(<<)

左移运算符<<用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补0。

例如,9<<3可以转换为如下的运算:

<< 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)

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

0000 0000 -- 0000 0000 -- 0000 0000 -- 0100 1000 (72 在内存中的存储)

所以9<<3的结果为 72。

又如,(-9)<<3可以转换为如下的运算:

<< 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)

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

1111 1111 -- 1111 1111 -- 1111 1111 -- 1011 1000 (-72 在内存中的存储)

所以(-9)<<3的结果为 -72

如果数据较小,被丢弃的高位不包含 1,那么左移 n 位相当于乘以 2 的 n 次方。

【实例】对上面的结果进行校验。

00001. #include

00002.

00003. int main(){

00004. printf("%d, %d ", 9<<3, (-9)<<3 );

00005. return 0;

00006. }

运行结果:

72, -72

右移运算(>>)

右移运算符>>用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1。如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1。

例如,9>>3可以转换为如下的运算:

>> 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)

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

0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在内存中的存储)

所以9>>3的结果为 1。

又如,(-9)>>3可以转换为如下的运算:

>> 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)

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

1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 1110 (-2 在内存中的存储)

所以(-9)>>3的结果为 -2

如果被丢弃的低位不包含 1,那么右移 n 位相当于除以 2 的 n 次方(但被移除的位中经常会包含 1)。

【实例】对上面的结果进行校验。

00001. #include

00002.

00003. int main(){

00004. printf("%d, %d ", 9>>3, (-9)>>3 );

00005. return 0;

00006. }

运行结果:

1, -2

c语言位运算符的用法3

一、位运算符

在计算机中,数据都是以二进制数形式存放的,位运算就是指对存储单元中二进制位的运算。C语言提供6种位运算符。

二、位运算

位运算符 & |~<< >> ∧ 按优先级从高到低排列的顺序是:

位运算符中求反运算“~“优先级最高,而左移和右移相同,居于第二,接下来的顺序是按位与 “&“、按位异或 “∧“和按位或 “|“。顺序为~ << >> & ∧ | 。

例1:左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。

例如:

a<<4

指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。

例2:右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。

例如:

设 a=15,

a>>2

表示把000001111右移为00000011(十进制3)。

应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。

例3:设二进制数a是00101101 ,若通过异或运算a∧b 使a的高4位取反,低4位不变,则二进制数b是。

解析:异或运算常用来使特定位翻转,只要使需翻转的位与1进行异或操作就可以了,因为原数中值为1的位与1进行异或运算得0 ,原数中值为0的位与1进行异或运算结果得1。而与0进行异或的位将保持原值。异或运算还可用来交换两个值,不用临时变量。

如 int a=3 , b=4;,想将a与b的值互换,可用如下语句实现:

a=a∧b;

b=b∧a;

a=a∧b;

所以本题的答案为: 11110000 。

Ⅲ C语言的移位操作符使用方法

移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移花接木有关。如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。若是不带符号数,则补入的数全部为0;若是带符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位)。具体移位规则如下所示。

位移位运算符的优先级如下:

·算术运算符优先于位移位运算符 优先于 关系运算符

·位移位运算符是同级别的,结合性是自左向右

例如,设无符号短整型变量a为0111(对应二进制数为0000000001001001),

则:a<<3 结果为01110(对应二进制数为0000001001001000),a不变

a>>4 结果为04(对应二进制数为0000000000000100),a不变

又如,设短整型变量a为-4(对应二进制数为 1111111111111100),

则:a<<3 结果为-32(对应二进制数为1111111111100000),a不变

a>>4 结果为-1(对应二进制数为1111111111111111),a不变

C语言里的左移和右移运算

2006-09-30 13:52

先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:

int i = 1;

i = i << 2; //把i里的值左移2位

也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000... 0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)

需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:

int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000

i = i << 1;

那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.

左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:

int i = 1, j = 0x80000000; //设int为32位

i = i << 33; // 33 % 32 = 1 左移1位,i变成2

j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的'就是1位,也就是33%32 后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.

总之左移 就是: 丢弃最高位,0补最低位

再说右移,明白了左移的道理,那么右移就比较好理解了.

右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.

右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:

int i = 0x80000000;

i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000

就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.

负数10100110 >>5(假设字长为8位),则得到的是 11111101

总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变 .实际应用中可以根据情况用左/右移做快速的乘 /除运算,这样会比循环效率高很多.

在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

操作符 作用

────────────────────────────

& 位逻辑与

| 位逻辑或

^ 位逻辑异或

- 位逻辑反

>> 右移

<< 左移

━━━━━━━━━━━━━━━━━━━━━━━━━━━━

按位运算是对字节或字中的实际位进行检测、设置或移位, 它只适用于字符型和整数型变量以及它们的变体, 对其它数据类型不适用。

我们要注意区分位运算和逻辑运算。

1.按位与运算

按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。

例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码)00000001 (1的二进制补码)可见9&5=1。

按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。

main(){

int a=9,b=5,c;

c=a&b;

printf("a=%d b=%d c=%d ",a,b,c);

}

2. 按位或运算

按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

例如:9|5可写算式如下: 00001001|00000101

00001101 (十进制为13)可见9|5=13

main(){

int a=9,b=5,c;

c=a|b;

printf("a=%d b=%d c=%d ",a,b,c);

}

3. 按位异或运算

按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如 9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)

main(){

int a=9;

a=a^15;

printf("a=%d ",a);

}

4. 求反运算

求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110

5. 左移运算

左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。

6. 右移运算

右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。例如:设 a=15,a>>2表示把000001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。

main(){

unsigned a,b;

printf("input a number: ");

scanf("%d",&a);

b=a>>5;

b=b&15;

printf("a=%d b=%d ",a,b);

}

请再看一例!

main(){

char a='a',b='b';

int p,c,d;

p=a;

p=(p<<8)|b;

d=p&0xff;

c=(p&0xff00)>>8;

printf("a=%d b=%d c=%d d=%d ",a,b,c,d);

}

当进行按位与或时,最好使用16进制,在程序中这样表示:0x01 表示0000 0001

所以,字符类型a的最高位强制1可以这样:a=a|0x80。其他的可以依次类推!

Ⅳ c/c++ 语言 左右移位操作

是的,

unsigneda=-1;//(a=0xffffffff)
intb=-1;//(b=0xffffffff)
a>>=5;//(a=0x07ffffff)
b>>=5;//(b=0xffffffff)

Ⅳ C语言中>>和<<如何使用

C语言中<< 代表左移运算符,>> 代表右移运算符,位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算。

<< 代表左移运算符:左移运算符用来将一个数的各二进制位全部左移若干位,移动的位数由右操作数指定,右操作数必须是非负值,其右边空出的位用0填补,高位左移溢出则舍弃该高位。

例如:设无符号短整型变量a为0111(对应二进制数为0000000100010001),则:a<<3 结果为0888(对应二进制数为0000100010001000)。

>> 代表右移运算符:右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。

例如:var temp = 56 >> 2 变量temp的值为 14,因为56 (即二进制的 00111000)向右移两位等于14 (即二进制的 00001110) 。

(5)c语言移位运算符使用的简单方法扩展阅读:

相关运算规则:

1、在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。

2、移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。

3、位移位运算符的优先级:算术运算符优先于位移位运算符优先于关系运算符,位移位运算符是同级别的,结合性是自左向右。

Ⅵ C语言移位运算符怎么用

这是c++好吧。。。。算了c和c++的移位运算符都一样
这个难道不对吗,左移就是*2啊(不越界的话)
原理就是你把1110化成二进制(000010001010110),然后每个位都向左移一位,最低位补0,次高位舍弃(最高位是符号位,不能动)

Ⅶ C语言中位移位运算符

位移位运算符,顾名思议,用来移位用。
如:
a=0x01;
a <<=2;
则,a变成0x04了。
上面是左移,如果右移是a >>= 2;

Ⅷ C语言左位移运算符和右位移运算符是什么意思,怎么运算,举个例子..

就是把一个数转化成二进制再直接对他进行操作
例如:
45>>2 //45右移两位
45的二进制为:101101
右移两位就为: 001011
001011再转化为十进制为:11
所以45>>2= 11
左移运算符
45<<2
45的二进制为:101101
左移两位就为:10110100
10110100再转化为十进制为:180
所以45<<2=180

Ⅸ C语言按位左移运算规则

C语言中按位左移的运算符为<<,其规则如下:

对于操作a<<n,

1 按照二进制值每位向高位(书写上是向左)移动n位;

2 最高位(最左边的)n位舍去;

3 最低位(最右边)填加n个0.


简单起见,用char型举例如下:

例一

0x12 << 3 =>

B00010010 << 3 =>

B10010 000(这里最高位的三个0被舍去,其它依次左移,最低位补三个0) =>

0x90

即0x12 << 3 = 0x90

例二

0x9E << 2 =>

B10011110 << 2 =>

B01111000 (最高位10舍去,最低位补两个0)=>

0x78


可以编写如下程序验证:

#include<stdio.h>
voidcheck(chara,intn)
{
printf("0x%hhx<<%d=0x%hhx ",a,n,a<<n);
}

intmain()
{
check(0x12,3);
check(0x9e,2);

return0;
}

其运行结果为

0x12<<3=0x90
0x9e<<2=0x78

可以看到与我们计算结果是相符的。