【问题标题】:How to remove the leftmost bit and add bit in its rightmost bit如何删除最左边的位并在最右边的位中添加位
【发布时间】:2012-05-21 06:11:40
【问题描述】:

如何去掉最左边的位?

我有一个十六进制值BF

它的二进制表示是1011 1111

如何去掉第一位1,然后变成0111 1110

如何将“0”也添加到其最后一部分?

【问题讨论】:

  • 您尝试编写什么代码来执行此操作?哪里出错了?
  • 我想在 C# 中尝试一下,我不知道如何编写代码.. 我想我应该需要使用“>>”,但我不知道该运算符如何运作..

标签: c# binary hex byte


【解决方案1】:

将变量x的位N设置为0

x &= ~(1 << N);

工作原理: 表达式 1 shifted N times to the left。对于 N = 7,这将是

1000 0000

bitwise NOToperator ~ 将其反转为

0111 1111

那么结果是bitwise ANDedx,给出:

xxxx xxxx
0111 1111
--------- [AND]
0xxx xxxx

结果:第 7 位(从 LSB 开始的从零开始的计数)被关闭,所有其他位都保留其先前的值。

将变量x的位N设置为1

x |= 1 << N;

它是如何工作的:这次我们将移位的位和bitwise ORx 相结合,给出:

xxxx xxxx
1000 0000
--------- [OR]
1xxx xxxx

结果:第 7 位打开,所有其他都保留之前的值。

查找最高位设置为1:

如果您不知道设置为 1 的最高位是哪个,您可以即时找出。有很多方法可以做到这一点;一个合理的方法是

int x = 0xbf;
int highestSetBit = -1; // assume that to begin with, x is all zeroes
while (x != 0) {
    ++highestSetBit;
    x >>= 1;
}

在循环结束时,highestSetBit 将是预期的 7。

See it in action.

【讨论】:

    【解决方案2】:
    int i=0xbf;
    int j=(i<<1) & 0xff;
    

    【讨论】:

    • "
    • 0000 0000 1011 1111 将变为 0000 0001 0111 1110。由于您想在 8 位后切断,我对0000 0000 1111 1111 进行按位逻辑与(运算符 &),结果为0000 0000 0111 1110-您想要的结果
    • 必须使用运算符&吗?因为我已经在 "
    • 在0000 0001 0111 1110,也就是0x017E,但是你要0x7E,所以需要截断。您可以使用 byte 数据类型来解决这个问题:byte j=(byte)(i
    • 感谢 Eugen Rieck.. 关于这个“
    【解决方案3】:

    或者你可以这样做: (i*2) && 0xff 如果你不想做一些玩弄。 >>1 相当于 /2,

    【讨论】:

    • 0xff 的目的是什么?
    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 2011-03-13
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多