不用临时变量交换两个数

异或有两个好用的性质:x ^ x == 0,x ^ 0 == x。于是 (a ^ b) ^ b 就变回了 a。靠它可以不用第三个变量交换两个数: a ^= b; /* a 存的是 a^b */ b ^= a; /* b =

开始练习 →

母题:QQ 号的二进制有几个 1

输入你的 QQ 号 n(不超过 4294967295),输出它的二进制里有几个 1。例如输入 13(1101),输出: 3 思路:每次用 n & 1 看最低位,再 n >>= 1 把它扔掉,直到 n 变成 0。程序有时会

开始练习 →

变式 1:是不是 2 的幂

2 的幂(1、2、4、8……)的二进制只有一个 1。妙招:n & (n - 1) 会把 n 最低位的那个 1 消掉,所以 n 是 2 的幂 ⇔ n > 0 且 n & (n - 1) 等于 0。 输入一个 1~255

开始练习 →

变式 2:单号双号各几人

体测按号码分单双号两组。第一行输入人数 m,第二行输入 m 个号码(非负整数)。输出双号(偶数)和单号(奇数)各几人。例如输入: 6 1 1 2 3 5 8 输出: 2 4 用 x & 1 看最低位就知道奇偶,比 % 2 还快。可程

开始练习 →

变式 3:异或交换倒序数组

第一行输入 n(1~20),第二行输入 n 个整数,用异或交换把数组倒过来再输出。例如输入: 3 6 8 9 输出: 9 8 6 偶数个元素时程序是对的,奇数个时正中间那个数变成了 0。

开始练习 →

变式 4:拆出颜色的 R G B

网页颜色 #FF8800 是 24 位:高 8 位红 R、中 8 位绿 G、低 8 位蓝 B。scanf("%x", &c) 可以直接读十六进制数(%x 就是十六进制格式)。 输入 6 位十六进制颜色(不带 #)

开始练习 →

二级 · 程序填空:n & (n - 1) 数 1

下面的程序统计 200 的二进制中 1 的个数,输出 3。请在【】处填入正确的内容。 #include <stdio.h> int main(void) { unsigned int n = 200, cnt = 0;

开始练习 →

二级 · 程序改错:异或交换与判奇偶

下面程序的功能是:输入两个整数 a、b,用异或交换后在第一行输出 a b;第二行判断交换后的 a 是偶数还是奇数。输入 3 6 时输出: 6 3 偶数 程序中有两处错误。请改正 found 下面一行中的错误,不要改动其他地方,也不要增删行。

开始练习 →

二级 · 选择:& 和 == 谁先算

以下程序的输出是【0】 【1】。 #include <stdio.h> int main(void) { int x = 6; printf("%d %d\n", x & 4 ==

开始练习 →

二级 · 程序设计:fun 最长连续打卡

一个月(最多 32 天)的背单词打卡记录存在一个 unsigned int 里:第 i 位是 1 表示第 i 天打了卡。请编写函数 fun,返回最长连续打卡的天数。例如 x 为 486(二进制 1 1110 0110)时,函数返回: 4 注

开始练习 →