读书人

位运算解决思路

发布时间: 2012-03-24 14:00:47 作者: rapoo

位运算
各路大侠请问位运算该怎么算啦,什么左移一位,右移一位,具体是怎么算呢,希望能举个例子,最好简单些,因为本人正在自学C。

[解决办法]
多实践,多写代码,这个东西,就算你想不明白,写段代码去Debug也能看得清清楚楚,在Debug模式下将变量格式设置成二进制显示。
计算机的世界里,采用的是二进制,高低电平分别代表1和0
现实世界里,采用10进制,1左移1位变成10,相当于乘于10;在计算机世界里是相同的,不过0x1又移1位变成0x10=2,相当于乘于2.
<<操作符对左操作数进行向左移位,左边被移掉的位将被丢弃,右边空出来的位置用0填充。
>>操作符对左操作数进行向右移位,右边被移掉的为将被丢弃,如果左操作数是无符号值(或者非负的有符号值),左边空出来的位用0填充。但如果左操作数为负,则左边空出来的位用0还是用左操作数最左边的位(即1)填充取决于编译器(此时>>的结果是不可移植的)。
按照标准,如果右操作数是个负值,移位操作符的结果是未定义的.
[解决办法]
左移右移的时候请注意,(特别是右移)有时候填充上来的数会和符号位有关,也就是可能是补1的,而不是补0,具体的情况楼主应以实际实验结果为准,只要熟知原理,结果不需死记。
[解决办法]
我把一个程序放上来,你可以自己改着玩。

C/C++ code
#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <string.h>void paintBinaryFormat(char byte){    int destSize,strSize;    char str[] = "0x00000000";    char dest[33];    itoa(byte,dest,2);    destSize = strlen(dest);    strSize = strlen(str);    if(destSize > 8)    {        memcpy(str+2,dest+(destSize-8),8);    }    else    {        memcpy(str+(strSize-destSize),dest,destSize-1);    }    printf("\n [%s] \n",str);}//左移函数void leftShifting(char* pByte,int offset){    offset = offset % 8;    printf("左移 %d 位的值为",offset);    *pByte <<= offset;    paintBinaryFormat(*pByte);}//右移函数void rightShifting(char* pByte,int offset){    offset = offset % 8;    printf("右移 %d 位的值为",offset);    *pByte >>= offset;    paintBinaryFormat(*pByte);}int main(){    char byte = 0xf1;    printf("初始值");    paintBinaryFormat(byte);    //左移3位    leftShifting(&byte,3);    //右移1位    rightShifting(&byte,1);    return 0;}
[解决办法]
还有带C标志位的循环左移和右移。

AND 与运算.
OR 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SAL 算术左移.(=SHL)
SHR 逻辑右移.
SAR 算术右移.(=SHR)
ROL 循环左移.
ROR 循环右移.
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
移位一次时, 可直接用操作码. 如 SHL AX,1.
移位>1次时, 则由寄存器CL给出移位次数.
如 MOV CL,04 SHL AX,CL

[解决办法]
探讨
如果二进制为1000 0000那又怎么算呢

[解决办法]
左移相当于:×2
右移相当于:/2

读书人网 >C++

热点推荐