首页 > 编程语言 >POJ 3748(C++的16进制读法 %x)

POJ 3748(C++的16进制读法 %x)

时间:2022-10-25 12:33:32浏览次数:48  
标签:begin end 3748 16 s1 C++ longint turn16 shl


P党写几小时的程序 C++才几行……

首先P的位运算有上限2^30 此时 即便是 int64也会因为补码坑死人的


到1 shl 31时   int64 是负数 故 这个时候 不能shr 为多出好多位

造成以上结果的真正原因是 shl 和 shr 只支持到1 shl 30 (Longint)所以在int64或qword会出错 要自己写


C党读入方法 %x 表示 二进制


#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的做法:


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.

更正AC版:

Program P3748;
const
// ordA=65;
orda=97;
ord0=48;
var
s:string;
r,k:qword;
x,y,i: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 div 16;
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;

function shl2(x:longint):qword;
var
i:longint;
begin
shl2:=1;
for i:=1 to x do shl2:=shl2*2;

end;
begin
readln(s);
r:=cin16;x:=cin;val(s,y);


r:=r and (not (shl2(x)));


r:=r and (not (shl2(y-2)));

r:=r or (shl2(y-1));
r:=r or (shl2(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))


标签:begin,end,3748,16,s1,C++,longint,turn16,shl
From: https://blog.51cto.com/u_15724837/5794489

相关文章

  • C++ visit
    C++visit#include<iostream>structOutput{intm_i{8};template<typenameF>voidvisit(F&f){f(this->m_i);}template<typename......
  • 求和式 (C++ 坑爹的<<,>>,%lld)
    求和式(x3)题目描述作为本场考试的第一题,你的任务十分简单:给定长度为n的序列A[i],求所有A[i]xorA[j](i<j)的值之和 输入第一行一个整数N接下来N行,第i行为A[i]输出所需的值......
  • AcWing 216. Rainbow的信号
    题目链接:​​传送门​​将权值转化成二进制来看,最多30位枚举每一位并且枚举一个右端点通过这个右端点判断有多少个左端点符合条件,累计贡献要注意单独讨论左端点等于右端......
  • LOJ #2012. 「SCOI2016」背单词
    题目链接:​​传送门​​显然第一个情况和第二个情况不如第三个更优并且他们可以避免,所以尽量构造第三种情况将每个字符倒着插入trie树,因为先放后面的字符串是更优的然后......
  • c++ accumulate
    用于累加数组元素普通用法:accumulate(首指针,末指针,累加初始值)除了对数字求和还可以连接字符串#include<bits/stdc++.h>usingnamespacestd;vector<string>v;vector<i......
  • C++/C 规范:命名规范和注释
    变量变量命名里面只能是名词,不能有动词宏:全部大写,如:FRAME_SIZE变量:驼峰命名规则,首个单词小写,如:myFrameSize全局变量:在变量前后添加字母G,如:myFrameSizeG函数尽量......
  • 苹果14Pro Max拆解:AFEM-8240、SKY58853-17、SKY52628、SKY5xx92-16模块
    近期,iFixit对苹果最新iPhone14的拆解终于完成了,认为这次iPhone14最值得点赞的不是更强的处理器,也不是卫星SOS功能和更大的摄像头,而是完全重新设计的内部结构——显示面......
  • 安装邮件服务Exchange2016
    拓扑图:推荐步骤:Ø 升级活动目录名字是benet.com,将电子邮件服务器加入到域使用域管理员登录Ø 安装Exchange依赖程序,安装Exchange2016Ø 在活动目录创建组织单元名字......
  • C++ 不知树系列之初识树(树的邻接矩阵、双亲孩子表示法……)
    1.前言树是一种很重要的数据结构,最初对数据结构的定义就是指对树和图的研究,后来才广义化了数据结构这个概念。从而可看出树和图在数结构这一研究领域的重要性。树和图重......
  • C++ Multi Thread
    自定义LockclassReadLock{public:ReadLock(ZoneFile*zfile):zfile_(zfile){zfile_->writer_mtx_.lock();zfile_->readers_++;zfil......