【问题标题】:Bitwise operation to shift left AND change the right most bit?按位运算左移并改变最右边的位?
【发布时间】:2019-11-24 20:20:56
【问题描述】:

我正在尝试编写一个程序,它从用户那里获取字符串输入“0”和“1”,然后使用给定的字符串来更改另一个变量的每一位。

char input[20];
unsigned short bits = 0;

printf("Enter a binary string of 16 bits.\n");

fgets(input, 20, stdin);
input[strlen(input) - 1] = '\0';

是我必须从用户那里获取和存储一个两字节字符串的东西。然后我想获取该字符串并操作变量“位”以匹配输入的内容。

因此,如果用户输入 10011001 10011001,我想将“无符号短位”的值从全 0 更改为二进制的匹配值。

我现在的想法是,我可以遍历输入字符串并在每次传递时左移“位”,但据我所知,左移总是会丢弃最左边的位并添加一个 0 作为最右边的位。有没有办法用一些我不知道的按位命令将 1 添加为最左边的位,以便如果循环在字符串中看到“1”,它会在最右边的位上添加一个?

【问题讨论】:

  • 对于字符串的每个字符,将unsigned short bits左移并将位0设置为字符串中的值。如果输入的位数比需要的少,它仍然可以工作。
  • 我不认为input[strlen(input) - 1] = '\0'; 是正确的。
  • 删除了我之前的评论,因为我认为我误读了您的问题。但是,“添加 1 作为最左边的位”是错字吗?您指的是“正确”吗?
  • @LegendofPedro 可以,但不能保证有效。请看Removing trailing newline character from fgets() input
  • @WeatherVane 这是很好的信息。我在想如果你使用管道 echo "" 并且输入长度为零且没有换行符的字符串会发生什么。

标签: c


【解决方案1】:

使用 bits = (bits << 1); 移入 0。 使用bits = (bits << 1) | 1; 移入1。

【讨论】:

  • 这成功了!感谢您和其他所有人的快速回复。我快到了,但我在循环中错误地使用了 OR。
【解决方案2】:

这样会行。

在您的循环中,您首先将bits 向左移动,然后如果字符为1,则将OR 1:

bits |= 1;

【讨论】:

  • 或者只是添加 1 :)
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
相关资源
最近更新 更多