不足的位数补零,全是整数
C 语言中位运算包括下面几种:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
右移
前4 种操作很简单,一般不会出错。但要注意按位运算符|和&与逻辑运算符||和&&完全是两码事,别混淆了。其中按位异或操作可以实现不用第三个临时变量交换两个变量的值:
a ^= b; b ^= a;a ^= b;但并不推荐这么做,因为这样的代码读起来很费劲。
一、左移和右移
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。但注意:对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0;而为负数时,符号位为1,最高位是补0 或是补1 取决于编译系统的规定。Turbo C 和很多系统规定为补1。
二、0x01<<2+3 的值为多少?
再看看下面的例子:
0x01<<2+3;
结果为7 吗?测试一下。结果为32?别惊讶,32 才是正确答案。因为“+”号的优先级比移位运算符的优先级高(关于运算符的优先级,我并不想在这里做过多的讨论,你几乎可以在任何一本C 语言书上找到)。好,在32 位系统下,再把这个例子改写一下:
0x01<<2+30;或0x01<<2-3;
这样行吗?不行。一个整型数长度为32 位,左移32 位发生了什么事情?溢出!左移-1位呢?反过来移?所以,左移和右移的位数是有讲究的。左移和右移的位数不能大于数据的长度,不能小于0。
&是将两个二进制的数逐位相与,结果是相与之后的结果。
long long: 所占内存大小:8byte=64bit
" 移位操作都是针对补码进行的,正数的原码、补码、反码相同,负数的原码取反得反码,反码加一得补码。"
输入示例:
4 5
输出示例:
00100
解释:
代码:
#include<iostream>
using namespace std;
int main()
{ cout<<(4>>5);
long long n, k;
cin >> n >> k;
for (int i = k; i; i--)
cout << ((n >> (i - 1)) & 1);
return 0;
}
又发现了一个代码:采用字符数组的方式,下面的代码实现了将一个十进制数转换成二进制数并存储在字符数组中。
while(num>0)
{
arr[n++]=num%2 + '0';
num/=2;
}