NOJ---页面无法显示--位运算
好吧 先解决下 -- 页面无法显示
该死的Oj 不知道为什么突然无法打开了 =-= 我也就忘记题号了
主要现在这场乌拉圭-哥伦比亚 刚开始 忙里偷闲 把这题来写了
明天 不对 应该是今天 不知道要睡到什么时候 =-=
先来贴下关于位运算的操作要求及解释--------我好像上次贴过 我忘记了 orz
位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作
运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。
C语言提供的位运算符列表:
运算符 含义 描述
& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
// 感觉 紫色 最显眼啊
题目链接我暂时不能给出了 = 我明天睡醒 会补上
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 unsigned long long num; // 这边使用unsigned long long 可以满足题目的数据要求 7 while (cin >> num) 8 { 9 int len = 0; 10 unsigned long long temp = num; 11 while (temp) // 求出将 num -> 转成2进制数后的序列长度 如5->101 即 len = 3 12 { 13 temp>>= 1; 14 len++; 15 } 16 temp = num; 17 for (int i = 0; i < len; i++) 18 { 19 cout << temp; 20 if (temp & (1LL << (len - 1)) ) //这里的( 1LL <<(len-1) )就是从同样长度的二进制序列高位到低位为1开始枚举 21 { // 如果&成功 那么代表num的二进制序列的最左边(即最高位)是1 那么通过下面的操作就将1给移到了最后 22 temp = ( (temp ^ (1LL << (len - 1)) ) << 1 ) | 1; 23 } //主要是利用了 ^ 的性质 和 << 将二进制的数全左移并且低位用0补齐 然后与1 | 那么就是1了 24 else 25 { 26 temp = temp << 1;//进入到这里 说明最左位是0 那么直接<< 27 } 28 if (i < len - 1) 29 { 30 cout << " "; 31 } 32 else 33 { 34 cout << endl; 35 } 36 } 37 } 38 return 0; 39 }
最近 喜欢直接用c++ 的cin cout来写 流畅=-= 至于会不会tle的话 天意 不行 再改为 scanf printf吧
today:
我来年陌生的是昨日最亲的某某
最熟悉的陌生人
just follow your heart