我正在尝试打印long的二进制表示形式,以便练习位操作并为正在处理的项目在long中设置各种位。我可以成功打印int上的位,但是每当我尝试打印64位长的输出时,输出都是错误的。 这是我的代码:
#include <stdio.h>
void printbits(unsigned long n){
unsigned long i;
i = 1<<(sizeof(n)*4-1);
while(i>0){
if(n&1)
printf("1");
else
printf("0");
i >>= 1;
}
int main(){
unsigned long n=10;
printbits(n);
printf("\n");
}
我的输出是0000000000000000000000000000111111111111111111111111111111111111110。 感谢帮助!
答案 0 :(得分:4)
class MatchPresenterTest {
@Mock
private lateinit var view:MatchContract
@Mock
private lateinit var apiService: MatchService
@Mock
private lateinit var appSchedulerProvider: AppSchedulerProvider
private lateinit var presenter : MatchPresenter
@Before
fun setup(){
MockitoAnnotations.initMocks(this)
RxAndroidPlugins.getInstance().registerSchedulersHook(object : RxAndroidSchedulersHook() {
override fun getMainThreadScheduler(): Scheduler {
return Schedulers.immediate() // or .test()
}
})
presenter = MatchPresenter(view,apiService,appSchedulerProvider)
}
@Test
fun getLastMatch_shoul_callSucces(){
val event: MutableList<EventModel> = mutableListOf()
val response = MatchModel(event)
RxJavaHooks.setOnIOScheduler { scheduler1 -> Schedulers.immediate() }
Mockito.`when`(apiService.getLastMatches()
).thenReturn(Observable.just(response))
presenter.getLastMatch()
verify(view).onSuccess(response)
verify(view).onFailed("failed")
}
,unsigned long
也是1 << …
,所以您需要int
1UL
应该是n&1
仅修复:
n&i
如果您要专门打印64位数字,我将对64进行硬编码并使用#include <limits.h>
#include <stdio.h>
void printbits(unsigned long n){
unsigned long i;
i = 1UL<<(sizeof(n)*CHAR_BIT-1);
while(i>0){
if(n&i)
printf("1");
else
printf("0");
i >>= 1;
}
}
int main(){
unsigned long n=10;
printbits(n);
printf("\n");
}
。
答案 1 :(得分:2)
问题是uint_least64_t
出于多种原因不正确。
i = 1<<(sizeof(n)*4-1)
是32,而不是64。您可能想要sizeof(n)*4
sizeof(n)*8
可能会给您带来溢出,因为默认情况下1可能是32位。您应该使用1<<63
1ULL<<(sizeof(n)*8-1)
不一定是64位。您应该使用unsigned long
如果要更全面,请使用unsigned long long
(在sizeof(n) * CHAR_BIT
中定义)。
通常,应尽可能使用<limits.h>
定义(例如stdint
)。
答案 2 :(得分:0)
以下应做您想做的事:
#include <stdio.h>
void printbits(unsigned long number, unsigned int num_bits_to_print)
{
if (number || num_bits_to_print > 0) {
printbits(number >> 1, num_bits_to_print - 1);
printf("%d", number & 1);
}
}
我们一直递归地调用该函数,直到我们打印了足够的位,或者打印了整数(以占用更多位为准)为止。
直接将其包装在另一个函数中,可以完全满足您的要求:
void printbits64(unsigned long number) {
printbits(number, 64);
}