如何创建一个 (f)16 重复 n 次的数字?
How to create a number with (f)16 repeating n times?
我需要创建一个数字,其中 (f)16 重复 n 次。 0 < n <= 16.
我为 n = 16 尝试了以下示例
std::cout << "hi:" << std::hex << std::showbase << (1ULL << 64) - 1 << std::endl;
warning: shift count >= width of type [-Wshift-count-overflow]
std::cout << "hi:" << std::hex << std::showbase << (1ULL << 64) - 1 << std::endl;
^ ~~ 1 warning generated.
hi:0x200
如何在不溢出 ULL
的情况下获取所有数字 f
?
where (f)16 repeats n times.
如果我理解正确的话,我相信那是微不足道的。加一个f
。将数字向左移动 4 位。添加另一个 f
。左移 4 位。添加另一个 f
。重复 n
次。
#include <stdio.h>
unsigned long long gen(unsigned n) {
unsigned long long r = 0;
while (n--) {
r <<= 4;
r |= 0xf;
}
return r;
}
int main() {
for (int i = 0; i < 16; ++i) {
printf("%d -> %llx\n", i, gen(i));
}
}
输出:
0 -> 0
1 -> f
2 -> ff
3 -> fff
4 -> ffff
5 -> fffff
6 -> ffffff
7 -> fffffff
8 -> ffffffff
9 -> fffffffff
10 -> ffffffffff
11 -> fffffffffff
12 -> ffffffffffff
13 -> fffffffffffff
14 -> ffffffffffffff
15 -> fffffffffffffff
对于 n = 1 到 16,您可以从所有 F 开始,然后相应地移动:
0xFFFFFFFFFFFFFFFFULL >> (4*(16-n));
(单独处理 n=0)
如果 n
是 16 位且 unsigned long long
是 64 位,则移位 4*n
位会出现问题,因此您可以通过移位较小的量来解决问题。如果已知 n
为正,我们可以将其分为两个班次:
(1ull << 4 << 4*(n-1)) - 1u
并且,由于 1ull << 4
是一个常量,我们可以替换它:
(0x10ull << 4*(n-1)) - 1u
如果n
可以为零,那么,为了支持从0到16的任何值,我们不能使用单个表达式。一个解决方案是:
n ? 0 : (0x10ull << 4*(n-1)) - 1u
您可以通过以下方式编写一个单独的函数来查找示例。
#include <stdio.h>
unsigned long long create_hex( size_t n )
{
unsigned long long x = 0;
n %= 2 * sizeof( unsigned long long );
while ( n-- )
{
x = x << 4 | 0xf;
}
return x;
}
int main( void )
{
for ( size_t i = 0; i <= 16; i++ )
{
printf( "%zu -> %llx\n", i, create_hex( i ) );
}
}
程序输出为
0 -> 0
1 -> f
2 -> ff
3 -> fff
4 -> ffff
5 -> fffff
6 -> ffffff
7 -> fffffff
8 -> ffffffff
9 -> fffffffff
10 -> ffffffffff
11 -> fffffffffff
12 -> ffffffffffff
13 -> fffffffffffff
14 -> ffffffffffffff
15 -> fffffffffffffff
16 -> 0
因为最初你使用的是两种语言标签,C 和 C++,然后 运行 这个程序作为 C++ 程序用 header <stdio.h>
代替 <iostream>
和使用运算符 << 而不是 printf
.
的调用
如果您只对十六进制格式和数字 f
感兴趣,请使用其他答案。
下面的函数可以生成十六进制和十进制格式以及任何数字的数字。
#include <iostream>
uint64_t getNum(uint64_t digit, uint64_t times, uint64_t base)
{
if (base != 10 && base != 16) return 0;
if (digit >= base) return 0;
uint64_t res = 0;
uint64_t multiply = 1;
for(uint64_t i = 0; i < times; ++i)
{
res += digit * multiply;
multiply *= base;
}
return res;
}
int main() {
std::cout << getNum(3, 7, 10) << std::endl;
std::cout << std::hex << getNum(0xa, 14, 16) << std::dec << std::endl;
return 0;
}
输出:
3333333
aaaaaaaaaaaaaa
注意:当前代码没有溢出检测。
我需要创建一个数字,其中 (f)16 重复 n 次。 0 < n <= 16.
我为 n = 16 尝试了以下示例
std::cout << "hi:" << std::hex << std::showbase << (1ULL << 64) - 1 << std::endl;
warning: shift count >= width of type [-Wshift-count-overflow] std::cout << "hi:" << std::hex << std::showbase << (1ULL << 64) - 1 << std::endl; ^ ~~ 1 warning generated.
hi:0x200
如何在不溢出 ULL
的情况下获取所有数字 f
?
where (f)16 repeats n times.
如果我理解正确的话,我相信那是微不足道的。加一个f
。将数字向左移动 4 位。添加另一个 f
。左移 4 位。添加另一个 f
。重复 n
次。
#include <stdio.h>
unsigned long long gen(unsigned n) {
unsigned long long r = 0;
while (n--) {
r <<= 4;
r |= 0xf;
}
return r;
}
int main() {
for (int i = 0; i < 16; ++i) {
printf("%d -> %llx\n", i, gen(i));
}
}
输出:
0 -> 0
1 -> f
2 -> ff
3 -> fff
4 -> ffff
5 -> fffff
6 -> ffffff
7 -> fffffff
8 -> ffffffff
9 -> fffffffff
10 -> ffffffffff
11 -> fffffffffff
12 -> ffffffffffff
13 -> fffffffffffff
14 -> ffffffffffffff
15 -> fffffffffffffff
对于 n = 1 到 16,您可以从所有 F 开始,然后相应地移动:
0xFFFFFFFFFFFFFFFFULL >> (4*(16-n));
(单独处理 n=0)
如果 n
是 16 位且 unsigned long long
是 64 位,则移位 4*n
位会出现问题,因此您可以通过移位较小的量来解决问题。如果已知 n
为正,我们可以将其分为两个班次:
(1ull << 4 << 4*(n-1)) - 1u
并且,由于 1ull << 4
是一个常量,我们可以替换它:
(0x10ull << 4*(n-1)) - 1u
如果n
可以为零,那么,为了支持从0到16的任何值,我们不能使用单个表达式。一个解决方案是:
n ? 0 : (0x10ull << 4*(n-1)) - 1u
您可以通过以下方式编写一个单独的函数来查找示例。
#include <stdio.h>
unsigned long long create_hex( size_t n )
{
unsigned long long x = 0;
n %= 2 * sizeof( unsigned long long );
while ( n-- )
{
x = x << 4 | 0xf;
}
return x;
}
int main( void )
{
for ( size_t i = 0; i <= 16; i++ )
{
printf( "%zu -> %llx\n", i, create_hex( i ) );
}
}
程序输出为
0 -> 0
1 -> f
2 -> ff
3 -> fff
4 -> ffff
5 -> fffff
6 -> ffffff
7 -> fffffff
8 -> ffffffff
9 -> fffffffff
10 -> ffffffffff
11 -> fffffffffff
12 -> ffffffffffff
13 -> fffffffffffff
14 -> ffffffffffffff
15 -> fffffffffffffff
16 -> 0
因为最初你使用的是两种语言标签,C 和 C++,然后 运行 这个程序作为 C++ 程序用 header <stdio.h>
代替 <iostream>
和使用运算符 << 而不是 printf
.
如果您只对十六进制格式和数字 f
感兴趣,请使用其他答案。
下面的函数可以生成十六进制和十进制格式以及任何数字的数字。
#include <iostream>
uint64_t getNum(uint64_t digit, uint64_t times, uint64_t base)
{
if (base != 10 && base != 16) return 0;
if (digit >= base) return 0;
uint64_t res = 0;
uint64_t multiply = 1;
for(uint64_t i = 0; i < times; ++i)
{
res += digit * multiply;
multiply *= base;
}
return res;
}
int main() {
std::cout << getNum(3, 7, 10) << std::endl;
std::cout << std::hex << getNum(0xa, 14, 16) << std::dec << std::endl;
return 0;
}
输出:
3333333
aaaaaaaaaaaaaa
注意:当前代码没有溢出检测。