每个人!如果有一个新位要插入一个字节,我该如何解决?例如:
如果有一个新的位 1 到一个字节(例如 0xaa) 10101010==>11010101
如果有一个新位 0 t0 一个字节(例如 0xaa) 10101010==>01010101
有什么建议吗?
如果有一点
0x80 | (0xaa>>1)
如果没有一点
0x7F & (0xaa>>1)
这是一个奇怪的要求,但可以做到。这段代码有两个参数:第一个是整数形式的原始字节,第二个是要在位移后以 0 或 1 形式添加到左侧的位。使用整数很容易向右移位;只需除以 2,余数就会被丢弃。让我们取 2 的 7 次方并将其存储在 @FlagNumber 变量中以用于我们的计算。
如果我们想将左边的位设置为零,我们需要先检查该值。第八位的位应该已经为零,但让我们检查一下,以防有人传递了一个大于 255 的值,让我们检查一下。如果出于某种原因将其设置为 1,我们将使用简单的 ^ (xor) 将其关闭。
如果我们想将左边的位设置为 1,我们将使用一个简单的 | (或)打开)
我将把它全部包装在一个函数中,这就是你得到的。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Jacob Raines
-- Create date: 2013-04-03
-- Description: Shift byte to the right and set 8th bit
-- =============================================
CREATE FUNCTION dbo.Flag_ByteAppendLeft
(
@InputByte int, --10101010
@InputBit int --0 or 1
)
RETURNS int
AS
BEGIN
/* Examples & Notes
SELECT dbo.Flag_ByteAppendLeft(170, 1) --(10101010, 1) Should Return 11010101 (213)
SELECT dbo.Flag_ByteAppendLeft(170, 0) --(10101010, 0) Should Return 01010101 ( 85)
*/
DECLARE @OutputByte int
DECLARE @FlagPower as int
DECLARE @FlagNumber as int
SET @OutputByte = @InputByte / 2 --Bit Shift once to the right
SET @FlagNumber = 7 --Flag 7 (starting at 0) is the 8th bit.
SET @FlagPower = POWER(2, @FlagNumber)
IF (@InputBit = 0)
BEGIN
IF (@OutputByte & @FlagPower = @FlagPower) -- If set
BEGIN
SET @OutputByte = @OutputByte ^ @FlagPower -- Then Toggle Flag with xor
END
END
ELSE
BEGIN
SET @OutputByte = @OutputByte | @FlagPower -- Set Flag
END
RETURN @OutputByte
END
GO
在 C 中,如果它是unsigned int
.
logic 1
在左边加一点。
x = 0x80000000 | (x >> 1);
logic 0
在左边加一点。
x = x >> 1;
请注意,在 C 中,由于,>>
是逻辑移位,因此在右移时会向左unsigned int
放置一个位。logic 0
还要注意,这0x8000000
只会因为unsigned int
.