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