Char、Unsigned char 移位和转int 问题(3)

2025-07-23

为1。参与运算的两个数均以补码出现。 例如:9|5可写算式如下: 00001001|00000101 00001101 (十进制为13)可见9|5=13 main(){

int a=9,b=5,c; c=a|b;

printf(\}

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

printf(\}

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(\scanf(\b=a>>5; b=b&15;

printf(\}

请再看一例!

main(){

char a='a',b='b'; int p,c,d; p=a;

p=(p<<8)|b; d=p&0xff;

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

printf(\}

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

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

C++移位运算符

关于逻辑移位、算术移位可参见迅雷深大笔试题部分。的一道题。 以前看到C++标准上说,移位运算符(<<、>>)出界时的行为并不确定:

The behavior is undefined if the right operand is negative, orgreater than or equal to the length in bits of the promoted left operand.

我当时也没有深究过这个问题。前几天有个网友来信问起这件事,我才发现,这和IntelCPU的移位运算有关。下面是那位网友的来信以及我的回复:

您好!运算符<<作为位操作中的高效的操作,但我遇到一个问题:下面在VC环境下发现一个很不明白的地方,下面标注。 #include void main() {

unsigned int i,j; i=35;

//为什么下面两个左移操作结果不一样? j=1<

不知是哪里没有理解对。

原因是这样的:i=35;j=1<

mov dword ptr [i],23h mov eax,1

mov ecx,dword ptr [i] shl eax,cl

mov dword ptr [j],eax

在shl一句中,eax=1,cl=35。而IntelCPU执行shl指令时,会先将cl与31进行and操作,以限制左移的次数小于等于31。因为35 & 31 =3,所以这样的指令相当于将1左移3位,结果是8。

而j=1<<35;一句是常数运算,VC即使不做优化,编译器也会直接计算1<<35的结果。VC编译器发现35大于31时,就会直接将结果设置为0。这行代码编译产生的机器指令是: mov dword ptr [j],0

对上面这两种情况,如果把VC编译器的优化开关打开(比如编译成Release版本),编译器都会直接将结果设置为0。

所以,在C/C++语言中,移位操作不要超过界限,否则,结果是不可预期的。 下面是Intel文档中关于shl指令限制移位次数的说明:

The destination operand can be a register or a memory location.The count operand can be an immediate value or register CL. The count is maskedto 5 bits, which limits the count range to 0 to 31. A special opcode encodingis provided for a count of 1. 1.掩码

就是一串2进制对目标字段进行位与运算,屏蔽当前的输入位。

将源码与掩码经过逻辑运算得出新的操作数。其中要用到逻辑运算如OR运算。AND运算。用于如将ASCLL码中大写字母改作小写字母。 2.与或异或转换成补码运算 3. 用法:掩码(&) 4. 用法:打开位(|) 5.用法:关闭位(&~) 6. 用法:转置位(^)

7. 将Value的第bit_number位置1 Value |= 1 << bit_number; 8. 将Value的第bit_number位置0 Value &= ~( 1 << bit_number ); 9.value & 1 << bit_number 如果该位置已被置为1,则表达式的结果为非零值

C/C ++提供位逻辑运算符和移位运算符。二者只能用于整形和字符型。位运算符是对每位进行操作而不影响左右两位,这有别于常规运算符(&&|| !)是将整个数进行操作的。 一. 位逻辑运算符 1. ~ 按位取反 将1变为0,将0变为1 EG: ~(10011010) (01100101) 注:

VC++编译器,计算~10,得出的结果是-11。为什么不是5呢

10的二进制表示为1010,按位取反应该为0101,也就是十进制的5,为什么会得出-11?

VC是32位编译器,所以

10 = 00000000 00000000 00000000 00001010

~10 = 11111111 11111111 11111111 11110101 = -11 可以通过掩码(位与) 与15位与

15 = 00000000 00000000 00000000 00001111 ~10 = 00000000 00000000 00000000 00000101 = -11 2. & 按位取与

只有两个操作数都是1结果才是1,否则为0 10 = 00000000 00000000 00000000 00001010 12 = 00000000 00000000 00000000 00001100 &

8 = 00000000 00000000 00000000 00001000 3. | 按位取或

两个操作数任意一位为1结果就是1

10 = 00000000 00000000 00000000 00001010 12 = 00000000 00000000 00000000 00001100 |

14 = 00000000 00000000 00000000 00001110

4. ^ 按位异或

两个操作数不同为1,相同为0

10 = 00000000 00000000 00000000 00001010 12 = 00000000 00000000 00000000 00001100 ^

14 = 00000000 00000000 00000000 00000110

5. 用法:掩码

掩码是通过&(位与)将某些位设置为开(1),将某些位设置为关(0)。将掩码0看做不透明,将1看着透明。 EG:

如只显示第二、三位 107 = 0110 1011 6 = 0000 0110 &

2 = 0000 0010


Char、Unsigned char 移位和转int 问题(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:第一届湖北省大学生结构设计竞赛成绩汇总表

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219