程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 3748(C++的16進制讀法 %x)

POJ 3748(C++的16進制讀法 %x)

編輯:C++入門知識

P黨寫幾小時的程序 C++才幾行……
首先P的位運算有上限2^30 此時 即便是 int64也會因為補碼坑死人的

到2 shl 31為1時   int64 是負數 故 這個時候 不能shr 為多出好多位
C黨讀入方法 %x 表示 二進制
[C++] 
#include<cstdio> 
using namespace std; 
int r,x,y; 
int main() 

    scanf("%x,%d,%d",&r,&x,&y); 
    r=r&(~(1<<x)); 
    r=r&(~(1<<y-2)); 
    r=r|(1<<(y-1))|(1<<(y)); 
    printf("%x\n",r); 
     
     

P黨取到30的做法:

[delphi]
Program P3748; 
const 
// ordA=65; 
   orda=97; 
   ord0=48; 
var 
   s:string; 
   r:qword; 
   x,y:longint; 
function turn2(c:char):longint; 
begin 
   if ord(c)>=orda then begin exit(ord(c)-orda+10); end 
   else exit(ord(c)-ord0); 
end; 
function turn16(x:qword):longint; 
begin 
   if (x<>0) then 
   begin 
      turn16:=x and 15; 
      x:=x shr 4; 
      turn16(x); 
      if turn16<=10 then write(turn16) else write(chr(turn16-10+orda)); 
   end; 
end; 
function cin:longint; 
var 
   i:longint; 
   s1:string; 
begin 
   i:=1; 
   while s[i]<>',' do inc(i); 
   s1:=copy(s,1,i-1); 
   val(s1,cin); 
   delete(s,1,i); 
 
 
end; 
 
function cin16:qword; 
var 
   i,j:longint; 
   s1:string; 
begin 
   i:=1; 
   while s[i]<>',' do inc(i); 
   s1:=copy(s,1,i-1); 
   cin16:=0; 
   for j:=1 to i-1 do 
      cin16:=cin16 shl 4+turn2(s1[j]); 
   delete(s,1,i); 
end; 
 
 
begin 
   readln(s); 
   r:=cin16;x:=cin;val(s,y); 
 
 
   r:=r and (not (1 shl x)); 
 
   r:=r and (not (1 shl (y-2))); 
   r:=r or (1 shl (y-1)); 
   r:=r or (1 shl y); 
   turn16(r); 
   writeln; 
 
end. 

 

附:
    功能              |           示例            |    位運算
----------------------+---------------------------+--------------------
去掉最後一位          | (101101->10110)           | x shr 1
在最後加一個0         | (101101->1011010)         | x shl 1
在最後加一個1         | (101101->1011011)         | x shl 1+1
把最後一位變成1       | (101100->101101)          | x or 1
把最後一位變成0       | (101101->101100)          | x or 1-1
最後一位取反          | (101101->101100)          | x xor 1
把右數第k位變成1      | (101001->101101,k=3)      | x or (1 shl (k-1))
把右數第k位變成0      | (101101->101001,k=3)      | x and not (1 shl (k-1))
右數第k位取反         | (101001->101101,k=3)      | x xor (1 shl (k-1))
取末三位              | (1101101->101)            | x and 7
取末k位               | (1101101->1101,k=5)       | x and (1 shl k-1)
取右數第k位           | (1101101->1,k=4)          | x shr (k-1) and 1
把末k位變成1          | (101001->101111,k=4)      | x or (1 shl k-1)
末k位取反             | (101001->100110,k=4)      | x xor (1 shl k-1)
把右邊連續的1變成0    | (100101111->100100000)    | x and (x+1)
把右起第一個0變成1    | (100101111->100111111)    | x or (x+1)
把右邊連續的0變成1    | (11011000->11011111)      | x or (x-1)
取右邊連續的1         | (100101111->1111)         | (x xor (x+1)) shr 1
去掉右起第一個1的左邊 | (100101000->1000)         | x and (x xor (x-1))

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved