刷题笔记-(洛谷)二进制位互换

本文最后更新于:December 20, 2021 pm

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。

题目

题目链接

给出一个小于232的正整数。这个数可以用一个32位的二进制数表示(不足32位用0补足)。我们称这个二进制数的前16位为“高位”,后16位为“低位”。将它的高低位交换,我们可以得到一个新的数。试问这个新的数是多少(用十进制表示)。

例如,数13145201314520用二进制表示为0000 0000 0001 0100 0000 1110 1101 100000000000000101000000111011011000(添加了11个前导0补足为32位),其中前16位为高位,即0000 0000 0001 01000000000000010100;后16位为低位,即0000 1110 1101 10000000111011011000。将它的高低位进行交换,我们得到了一个新的二进制数0000 1110 1101 1000 0000 0000 0001 010000001110110110000000000000010100。它即是十进制的249036820249036820。

输入格式

一个正整数。

输出格式

将新的数输出

总结

AC代码:

1
2
3
4
5
6
7
8
9
10
11
public class Main {
public static void main(String[] args) throws Exception {
Scanner Scin = new Scanner(System.in);
StreamTokenizer STcin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
BufferedReader BRcin = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

long x = Scin.nextInt();
System.out.println(((x&0x0000ffff)<<16|(x&0xffff0000)>>16));
}
}

核心就一句输出代码。

其中,x&0x0000ffff是用来消除前16位,x&0xffff0000用来消除后16位。然后分别再向左、向右移动,然后两部分再合(逻辑或)起来,即为两部分交换位置后的新数。

感觉还能用于其他用处,但就先写在这儿吧。